spring自定义拦截器实现traceId跟踪请求全流程日志

在平时的项目中,会使用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);
    }
}

日志打印获取方式


     %d{yyyy-MM-dd HH:mm:ss}-[%X{traceId}] - %m%n
 

结果展示

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.

你可能感兴趣的:(spring自定义拦截器实现traceId跟踪请求全流程日志)