一. 配置入口
1.1 logback入口
Logback支持XML、Groovy的配置方式,以XML来说,它会默认查找resources目录下的logback-test.xml(用于测试)/logback.xml文件。
1.2 springboot 入口
使用logback-spring.xml文件进行配置
logback-spring.xml是由 Spring Boot 找到,插入自己的上下文信息,进一步处理后传递给Logback的.
<springProfile> Env </springProfile> -- 区分环境
<springProperty scope="context" name="APP_NAME"
source="spring.application.name"/> -- 获取spring上下文信息
二. logback-spring 配置简介
2.1 configuration
最外层的父标签,其中有几个属性配置(如: debug = true ) .但项目中较少使用.
2.2 property、springProperty、define
定义变量.
property 变量值通常为 常量、 xml上下文定义的变量 和Logback内建支持的上下文变量。(https://logback.qos.ch/manual/configuration.html#variableSubstitution)
springProperty 变量值可以拿到Spring上下文属性。定义后,可以供property使用。
<define> 可以通过代码返回 变量值
<define name="ip" class="com.test.IPLogPropertyDefiner" />
public class IPLogPropertyDefiner extends PropertyDefinerBase {
public IPLogPropertyDefiner() {
}
public String getPropertyValue() {
return ServerConstants.SERVER_IP_ADDRESS;
}
}
2.3 appender
定义日志输出到哪里,一般是写到文件。
logback提供了多种Appender. 常用两种:
- ch.qos.logback.core.rolling.RollingFileAppender负责将日志滚动打印
- ch.qos.logback.classic.AsyncAppender负责将日志异步打印,避免大量打印日志时阻塞线程。
详细介绍看官方文档:https://logback.qos.ch/manual/appenders.html。
<property name="pattern"
value="%d{HH:mm:ss.SSS} [%boldYellow(%-15.15thread)] [%X{MDC_LOG_ID}] %highlight(%-5level) %boldGreen(%-40.40logger{39}) - %msg %n"/>
<appender name="rolllingByDay" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>test.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<maxFileSize>200MB</maxFileSize>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>256</queueSize>
<discardingThreshold>0</discardingThreshold>
<neverBlock>true</neverBlock>
<appender-ref ref="rolllingByDay"/>
</appender>
2.4 logger 和 root
针对上一章中 某个Logger或者某个Logger集合 ,设置日志级别。
root 是所有Logger的默认设置。
<logger level="INFO" additivity="false" name="com.qb.user.UserDemo">
<appender-ref ref="rolllingByDay"/>
</logger>
<root level="INFO">
<appender-ref ref="async"/>
</root>
name支持最长前缀匹配原则。
如 假设我们定义了三个 logger com.qb.user.UserDemo,com.qb.user,com.qb. 对于
name = com.qb.user.UserDemo 的Logger实例,优先匹配到com.qb.user.UserDemo。
additivity属性最好设置为false. 如果为true。 对于上位的com.qb.user.UserDemoLogger实例,其日志可能打印三份。
2.5 springProfile
用于支持不用环境使用不用日志级别。 如 日常测试DEBUG,预发和线上使用INFO级别。
<springProfile name="daily">
<root level="DEBUG">
<appender-ref ref="async"/>
</root>
</springProfile>
<springProfile name="pre,prod">
<root level="INFO">
<appender-ref ref="async"/>
</root>
</springProfile>
三. 占位符
上文2.3章节中,我们通过 {pattern} 属性定义日志内容格式,其中用到了多种占位符。
详细可参考 https://logback.qos.ch/manual/layouts.html#conversionWord 。下文介绍常用的占位符。
%logger: 定义Logger实例name
简写:c/ lo
%message:输出你实际要打印的日志信息
简写: %msg
%exception:输出异常堆栈,对应通过Slf4j传入的异常
简写%ex
%level:输出日志级别
%marker:输出通过Marker
%mdc:输出MDC
用法:mdc{key:-defaultVal} 等价 X{key:-defaultVal}
%date: 输出时间
%thread:线程
%n:换行
3.1. 输出长度
%占位符{length}:指定输出长度。
当实际长度小于指定长度,输出时,包名从最高级开始缩小到首字母,直到小于等于指定长度,最后一级不会缩短。
[%logger{0}]:只保留最后一级,且不会被缩短
3.2. 格式修饰
% 和占位符中间,还有一个用于控制格式的可选配置,正负数字+点+正负数字。
第一个数字表示:最小输出长度。
第二个数字表示:最大输出长度。
第一个数字前的正负表示:实际长度小于最小长度时,左空格补齐或右空格补齐。默认正——左侧填充空格,即右对齐。
第二个数字前的正负表示:实际长度大于最大输出长度时,左或右先裁剪。默认正——先左裁剪,右保留。举例:
[%-5,-10logger]:com.foo.bar.Service-->[com.foo.ba],最大10个字符,优先保留左侧字符
[%-5,10logger]: com.foo.bar.Service--> [ar.Service],最大10个字符,优先保留右侧字符
四、MDC 中的 traceId
代码:
String traceId = IdUtil.fastSimpleUUID();
MDC.put(MDC_TRACE_ID, traceId);
日志:
[%X{MDC_LOG_ID}]