在平時(shí)的項(xiàng)目中余耽,會(huì)使用traceId跟蹤請(qǐng)求全流程日志,于是在demo項(xiàng)目中親自實(shí)踐下。
實(shí)現(xiàn)traceId的基本思路
當(dāng)客戶端有請(qǐng)求進(jìn)來(lái)時(shí),生成一個(gè)traceId放在ThreadLocal里膝晾,然后在日式打印時(shí),直接獲取即可务冕,本文是借助logback提供的MDC功能血当。
MDC是什么?
參考https://blog.csdn.net/qq_36801710/article/details/79737359
代碼實(shí)現(xiàn)
定義常量值
public class Constans {
public static final String TRACE_ID = "traceId";
}
自定義攔截器
攔截器的功能很簡(jiǎn)單禀忆,生成一個(gè)traceId放入MDC中(此處僅粘貼關(guān)鍵代碼)
@Component
public class TraceInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
MDC.put(Constans.TRACE_ID, this.generateTraceId());
return true;
}
private String generateTraceId() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
將攔截器注冊(cè)到Spring中
這一步很關(guān)鍵臊旭,我一開始實(shí)現(xiàn)的時(shí)候忘記了這一步,結(jié)果攔截器不生效箩退,查閱資料資料才配置生效离熏,這里也提醒我了,有空要看下攔截器的實(shí)現(xiàn)呢乏德。
@Component
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Autowired
private TraceInterceptor traceInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(traceInterceptor);
}
}
日志打印獲取方式
<pattern>
%d{yyyy-MM-dd HH:mm:ss}-[%X{traceId}] - %m%n
</pattern>
結(jié)果展示
2021-12-27 22:58:25-[9822203da81d481286d93b203d454eb2] - 這是我要打印的日志呢-------ProductInfoController.getById.param:1
2021-12-27 22:58:25-[9822203da81d481286d93b203d454eb2] - HikariPool-1 - Starting...
2021-12-27 22:58:25-[9822203da81d481286d93b203d454eb2] - HikariPool-1 - Start completed.