Springboot 项目中怎么配置 logback 日志系统?

发布时间:
2024-10-07 21:55
阅读量:
2
网上的集成有很多,但是感觉都是零散的,想着自己搭建一个springboot+logback+lombok的线上服务器实战记录帖子

环境&版本一览:

  • 开发工具:Intellij IDEA 2020.1.1
  • springboot: 2.5.4
  • jdk:1.8.0
  • maven:3.8.3
  • SLF4j + Logback + Lombok

maven 配置

Logback 是spring-boot-starter-web默认实现,所以我们可以不引入依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.4</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> <optional>true</optional> </dependency>

  • 日志的级别

public enum Level { ERROR(40, "ERROR"), WARN(30, "WARN"), INFO(20, "INFO"), //默认级别 DEBUG(10, "DEBUG"), TRACE(0, "TRACE"); // 上面最高下面最低日志级别从上往下看 `由高到底`

配置文件

服务器创建对应的文件夹
sudo mkdir -p /var/log/ql
sudo chmod -R 777 /var/log/ql

本地开发环境

application.properties

logging.level.root=info logging.file.path=/var/log/ql logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%method,%line] - %msg%n logging.pattern.console== %white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %yellow(%msg%n) logging.logback.rollingpolicy.max-history=7 logging.logback.rollingpolicy.max-file-size=50MB logging.logback.rollingpolicy.total-size-cap=5GB

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 日志存放路径 --> <!-- <property name="log.path" value="/var/log/ql"/>--> <springProperty scope="context" name="log.path" source="log.path" defaultValue="/var/log/default"/> <!-- 日志输出格式 --> <springProperty scope="context" name="logging.pattern.console" source="logging.pattern.console" defaultValue="%white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %cyan(%msg%n)"/> <!-- <property name="log.pattern"--> <!-- value="%white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %yellow(%msg%n)"/>--> <!-- 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${logging.pattern.console}</pattern> </encoder> </appender> <!-- 系统模块日志级别控制 --> <logger name="com.ql.center" level="info"/> <!-- Spring日志级别控制 --> <logger name="org.springframework" level="warn"/> <root level="info"> <appender-ref ref="console"/> </root> <!--系统操作日志--> <root level="info"> <appender-ref ref="console"/> </root> </configuration>

online 环境

resource/application.properties

logging.config=classpath:logback-spring-online.xml logging.level.root=info logging.file.path=/var/log/ql logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%method,%line] - %msg%n logging.pattern.console== %white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %yellow(%msg%n) logging.logback.rollingpolicy.max-history=7 logging.logback.rollingpolicy.max-file-size=50MB logging.logback.rollingpolicy.total-size-cap=5GB

resource/logback-spring-online.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 日志存放路径 --> <springProperty scope="context" name="logging.file.path" source="logging.file.path" defaultValue="/var/log/default"/> <!-- 控制台日志输出格式 --> <springProperty scope="context" name="logging.pattern.file" source="logging.pattern.file" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%method,%line] - %msg%n"/> <!-- 文件日志输出格式 --> <springProperty scope="context" name="logging.pattern.console" source="logging.pattern.console" defaultValue="%white(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([%thread]) %yellow(%-5level) %magenta(%-50.50class) %green(%logger{20}) - %white([%method,%line]) - %cyan(%msg%n)"/> <springProperty scope="context" name="logging.logback.rollingpolicy.max-history" source="logging.logback.rollingpolicy.max-history" defaultValue="3"/> <springProperty scope="context" name="logging.logback.rollingpolicy.max-file-size" source="logging.logback.rollingpolicy.max-file-size" defaultValue="10MB"/> <springProperty scope="context" name="logging.logback.rollingpolicy.total-size-cap" source="logging.logback.rollingpolicy.total-size-cap" defaultValue="1GB"/> <springProperty scope="context" name="logging.level.root" source="logging.level.root" defaultValue="INFO"/> <!-- 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${logging.pattern.console}</pattern> </encoder> </appender> <!-- 系统日志输出 --> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logging.file.path}/sys-info.log</file> <!-- 循环政策基于时间创建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${logging.file.path}/sys-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 日志最大的历史 60天 --> <maxHistory>${logging.logback.rollingpolicy.max-history}</maxHistory> <!-- 每个日志文件的最大大小 --> <maxFileSize>${logging.logback.rollingpolicy.max-file-size}</maxFileSize> <!-- 总空间使用限制例如1GB --> <totalSizeCap>${logging.logback.rollingpolicy.total-size-cap}</totalSizeCap> </rollingPolicy> <encoder> <pattern>${logging.pattern.file}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤的级别 只会打印debug不会有info日志--> <level>${logging.level.root}</level> <!-- 匹配时的操作接收记录 --> <onMatch>ACCEPT</onMatch> <!-- 不匹配时的操作拒绝不记录 --> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logging.file.path}/sys-warn.log</file> <!-- 循环政策基于时间创建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${logging.file.path}/sys-warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 日志最大的历史 60天 --> <maxHistory>${logging.logback.rollingpolicy.max-history}</maxHistory> <!-- 每个日志文件的最大大小 --> <maxFileSize>${logging.logback.rollingpolicy.max-file-size}</maxFileSize> <!-- 总空间使用限制例如1GB --> <totalSizeCap>${logging.logback.rollingpolicy.total-size-cap}</totalSizeCap> </rollingPolicy> <encoder> <pattern>${logging.pattern.file}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 过滤的级别 只会打印debug不会有info日志--> <level>WARN</level> <!-- 匹配时的操作接收记录 --> <onMatch>ACCEPT</onMatch> <!-- 不匹配时的操作拒绝不记录 --> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logging.file.path}/sys-error.log</file> <!-- 循环政策基于时间创建日志文件 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日志文件名格式 --> <fileNamePattern>${logging.file.path}/sys-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 日志最大的历史 60天 --> <maxHistory>${logging.logback.rollingpolicy.max-history}</maxHistory> <!-- 每个日志文件的最大大小 --> <maxFileSize>${logging.logback.rollingpolicy.max-file-size}</maxFileSize> <!-- 总空间使用限制例如1GB --> <totalSizeCap>${logging.logback.rollingpolicy.total-size-cap}</totalSizeCap> </rollingPolicy> <encoder> <pattern>${logging.pattern.file}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">--> <!-- &lt;!&ndash; 过滤的级别 &ndash;&gt;--> <!-- <level>ERROR</level>--> <!-- &lt;!&ndash; 匹配时的操作接收记录 &ndash;&gt;--> <!-- <onMatch>ACCEPT</onMatch>--> <!-- &lt;!&ndash; 不匹配时的操作拒绝不记录 &ndash;&gt;--> <!-- <onMismatch>DENY</onMismatch>--> <!-- </filter>--> </appender> <!-- 用户访问日志输出 --> <!-- 系统模块日志级别控制 --> <logger name="com.ql.center" level="info"/> <!-- Spring日志级别控制 --> <logger name="org.springframework" level="warn"/> <root level="info"> <appender-ref ref="console"/> </root> <!--系统操作日志--> <root level="info"> <appender-ref ref="file_info"/> <appender-ref ref="file_warn"/> <appender-ref ref="file_error"/> </root> </configuration>

开发代码

@Slf4j @Api(tags = "账号相关信息") @RestController @RequestMapping("/account") public class AccountController { private SysAccountManager sysAccountManager; @ApiOperation(value = "手机、密码登录", notes = "返回 RestBody<String> 类型") @ArchivesLog(allowEntry = true, methodMeaning = "《《手机、密码登录》》") @PostMapping(value = "/loginByMobile", produces = MediaType.APPLICATION_JSON_VALUE) public RestBody<String> loginByMobile(@RequestBody MobileLoginDTO dto) { log.debug("<<Im debug>>"); log.info("<<Im info>>"); log.warn("<<Im warn>>"); log.error("<<Im error>>"); return RestBody.success(sysAccountManager.doLoginMobile(dto)); } }

  • 项目启动后会看到

  • 然后当logging.level.root=info
    • 会把log.info("<<Im info>>"); 打印到 sys-info.log 内。
    • 会把log.warn("<<Im warn>>"); 打印到 sys-warn.log 内。
    • 会把log.error("<<Im error>>"); 打印到 sys-error.log 内。
  • 然后当logging.level.root=error
    • 会把llog.error("<<Im error>>"); 打印到 sys-info.log 内。
    • 会把log.error("<<Im error>>"); 打印到 sys-error.log 内。
以上配置,线上环境基本可用,具体可根据自己的需求进行微调修改!

END