spring开发web项目经常会查看日志,通常都是根据每个http请求来查询整个链路的日志。有时这些请求的参数都差不多,日志也很相似,很难分辨出是否同一链路的请求。有时我会根据线程id来查询,但是tomcat的线程是复用的,同一个线程id对应多个请求链路日志,为此还是想办法为每个请求分配一个链路id。
- 打标记:logback 在 SLF4J API 利用诊断上下文映射 (MDC)为每个请求打上唯一标记。例如:标记为traceId。
- 使用标记:logback的pattern使用 %X{traceId}。
- 打标记时机:HandlerInterceptor的preHandle方法
- 清除标记:HandlerInterceptor的afterCompletion方法
打标记/清除标记
1、打标记【preHandle方法】
filter类:Interceptor
String traceId = getTraceId(request);
MDC.put("traceId", traceId);
private String getTraceId(HttpServletRequest request){
return String.format("%s - %s",request.getRequestURI(), UUID.randomUUID());
}
备注:filter需注
@Bean
WebMvcConfigurer createWebMvcConfigurer(@Autowired HandlerInterceptor[] interceptors) {
return new WebMvcConfigurer() {
public void addInterceptors(InterceptorRegistry registry) {
for (HandlerInterceptor interceptor : interceptors) {
registry.addInterceptor(interceptor);
}
}
};
}
2、清除标记【afterCompletion方法】
MDC.clear();
logback
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_FILE" value="god" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每日归档日志文件 -->
<fileNamePattern>./log/${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<!-- 保留 30 天的归档日志文件 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限 3G,超过后会删除旧的归档日志文件 -->
<totalSizeCap>100MB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{50} %L - %msg%n</pattern>
</encoder>
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{50} %L - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.xxx" level="debug" />
<root level="debug">
<!-- <appender-ref ref="console" />-->
<appender-ref ref="FILE" />
</root>
</configuration>
备注:%X{traceId} : 标记的使用和输出。
评论 (0)