目的
- 用戶的每次請求都是獨立的,爲了方便追溯,我們打出的日誌應該針對單次請求有唯一標示,就是 traceId
- 可以通過線程 ID 來區分,但線程是可複用的。
- 解決方法是 MDC。
- 通過添加 filter,請求到達時,把 traceId 放到 MDC,這樣每次請求生命週期,打出的日誌就可以帶上唯一標識。
方法
1. 實現 TraceInterceptor
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.web.servlet.HandlerInterceptor;
public class TraceInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceId = UUID.randomUUID().toString().toUpperCase();
MDC.put("TRACE_ID", traceId);
return true;
}
}
2. 註冊 Interceptor
@Configuration 註解保證 InterceptorConfig 會被 SpringBoot 作爲 bean 加載
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public TraceInterceptor initTraceInterceptor() {
return new TraceInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(initTraceInterceptor()).addPathPatterns("/**");
}
}
3. 配置 log4j2.xml
裏邊需要包含 TRACE_ID
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - TRACE_ID=%X{TRACE_ID} %msg%n</pattern>
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="120 seconds">
<appender name="FILE_TEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/Users/charles.lin/Downloads/jingwei.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/Users/charles.lin/Downloads/%d{yyyy-MM-dd}/jingwei.%d{yyyy-MM-dd}.%i.gz
</fileNamePattern>
<maxFileSize>512MB</maxFileSize>
<!-- keep 7 days' worth of history capped at 5GB total size -->
<maxHistory>7</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - TRACE_ID=%X{TRACE_ID} %msg%n
</pattern>
</encoder>
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - TRACE_ID=%X{TRACE_ID} %msg%n
</pattern>
</encoder>
</appender>
<logger name="FileTest" level="INFO">
<appender-ref ref="FILE_TEST"/>
</logger>
<logger name="console" level="INFO">
<appender-ref ref="console"/>
</logger>
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>
4. 查看效果
20:43:48.093 [http-nio-8081-exec-2] ERROR c.a.d.p.controller.ServiceController - TRACE_ID=8905FF6C-2B8E-4412-A31A-4E3CFB04DB6D some log info