Logback
基于Logback 的Java 日志处理
基础配置
我们可以通过
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 引入 Spring Boot 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定义变量 -->
<property name="APP_NAME" value="test"/>
<property name="LOG_PATH" value="${user.home}/${APP_NAME}/logs"/>
<property name="LOG_FILE" value="${LOG_PATH}/application.log"/>
<!-- 日志输出级别变量 @see application-xxx.properties-->
<springProperty scope="context" name="logLevel" source="log.level"/>
<appender>
// xxxx
</appender>
<logger>
// xxxx
</logger>
<root level="${logLevel}">
// xxxx
</root>
</configuration>
${name}
来使用变量。
<included>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">
<destinationLogger>org.springframework.boot</destinationLogger>
</appender>
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
...
<logger name="org.springframework.boot.actuate.endpoint.jmx" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
<logger name="org.thymeleaf" additivity="false">
<appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
</logger>
</included>
然后在
// 通过 Slf4j LoggerFactory 获取 logger 对象
private static final Logger logger = LoggerFactory.getLogger(DemoTest.class);
// 通过 Slf4j 注解注入
@Slf4j
logger.info("info")
Appender
- ConsoleAppender:把日志添加到控制台
- FileAppender:把日志添加到文件
- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。它是
FileAppender 的子类
ConsoleAppender
最常用的日志输出就是输出到
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>logback: %d {HH:mm:ss.SSS} %logger{36} - %M - %msg%n</pattern>
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|%class|%thread|%method|%line|%msg%n</pattern>-->
<!-- 使用 Spring Boot 预定义的 Pattern -->
<!--<pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
</encoder>
</appender>
<root level="${logLevel}">
<appender-ref ref="console"/>
</root>
RollingFileAppender
<appender name="APPLICATION"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>7</maxHistory>
<maxFileSize>50MB</maxFileSize>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
其中
Filter
在真实场景下,我们可能会需要将不同级别的日志输出到不同的文件中,在不引入新的
- DENY:日志将立即被抛弃不再经过其他过滤器
- NEUTRAL:有序列表里的下个过滤器过接着处理日志
- ACCEPT:日志会被立即处理,不再经过剩余过滤器
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--要拦截的日志级别-->
<level>ERROR</level>
<!--如果匹配,则禁止-->
<onMatch>DENY</onMatch>
<!--如果不匹配,则允许记录-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>%d -- %msg%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--添加 范围 过滤-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>%d -- %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
其他的常用的
-
ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL ;当日志级别低于临界值时,日志会被拒绝。 -
LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath( 用于配置符合过滤条件的操作) 和onMismatch( 用于配置不符合过滤条件的操作) 接收或拒绝日志。
Logger
我们可以通过自定义
<logger name="wx.spring.boot.controller"
level="${logging.level}" additivity="false">
<appender-ref ref="console" />
</logger>
上面的这个配置文件描述的是:${logging.level}
级别的日志将会使用
name: 用来指定受此logger 约束的某一个包或者具体的某一个类。level: 用来设置打印级别(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和OFF ) ,还有一个值INHERITED 或者同义词NULL ,代表强制执行上级的级别。如果没有设置此属性,那么当前logger 将会继承上级的级别。addtivity: 用来描述是否向上级logger 传递打印信息。默认是true 。
<!-- fileControllerLog-->
<appender name="fileControllerLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${APP_LOG_FILE}</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${logging.level}</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} %t %logger{0} %m%n</pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_LOG_FILE}.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<!--此logger约束将.controller 包下的日志输出到 fileControllerLog-->
<logger name="wx.spring.boot.controller" level="${logging.level}" additivity="false">
<appender-ref ref="fileControllerLog" />
<appender-ref ref="fileErrorLog" />
</logger>
<!--此logger约束将.service 包下的日志输出到 fileServiceLog-->
<logger name="wx.spring.boot.service" level="${logging.level}" additivity="false">
<appender-ref ref="fileServiceLog" />
<appender-ref ref="fileErrorLog" />
</logger>
我们也可以将日志维度固定到某个具体的类:
<!--这里指定到了具体的某一个类-->
<logger name="wx.spring.boot.task.TestLogTask" level="${logging.level}" additivity="true">
<appender-ref ref="SCHEDULERTASKLOCK-APPENDER" />
<appender-ref ref="fileErrorLog" />
</logger>
或者自定义
<logger name="dependency" level="info" additivity="false">
<appender-ref ref="dependencyAppender" />
</logger>
然后在代码中显式获取:
private static Logger logger = LoggerFactory.getLogger("dependency");
如果我们希望打印出
<!-- 将sql语句输出到具体的日志文件中 -->
<logger name="wx.dao" level="${logging.sql.level}" additivity="false">
<appender-ref ref="sqlAppender"/>
</logger>
Links
- https://mp.weixin.qq.com/s/IAGPxOfCz9a2C0VrnyT2eg
Logback 配置文件这么写,TPS 提高10 倍