spring为每个请求增加traceId

Lewis
2022-07-31 / 0 评论 / 16 阅读 / 正在检测是否收录...

  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

评论 (0)

取消