在平时的项目中,会使用traceId跟踪请求全流程日志,于是在demo项目中亲自实践下。
实现traceId的基本思路
当客户端有请求进来时,生成一个traceId放在ThreadLocal里,然后在日式打印时,直接获取即可,本文是借助logback提供的MDC功能。
MDC是什么?
参考https://blog.csdn.net/qq_36801710/article/details/79737359
代码实现
定义常量值
public class Constans {
public static final String TRACE_ID = "traceId";
}
自定义拦截器
拦截器的功能很简单,生成一个traceId放入MDC中(此处仅粘贴关键代码)
@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("-", "");
}
}
将拦截器注册到Spring中
这一步很关键,我一开始实现的时候忘记了这一步,结果拦截器不生效,查阅资料资料才配置生效,这里也提醒我了,有空要看下拦截器的实现呢。
@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>
结果展示
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.