spring为每个请求增加traceId

前言

spring开发web项目经常会查看日志,通常都是根据每个http请求来查询整个链路的日志。

有时这些请求的参数都差不多,日志也很相似,很难分辨出是否同一链路的请求。

有时我会根据线程id来查询,但是tomcat的线程是复用的,同一个线程id对应多个请求链路日志,为此还是想办法为每个请求分配一个链路id。

原理

  • 打标记:logback 在 SLF4J API 利用诊断上下文映射 (MDC)为每个请求打上唯一标记。例如:标记为traceId。
  • 使用标记:logback的pattern使用 %X{traceId}。
  • 打标记时机:HandlerInterceptor的preHandle方法
  • 清除标记:HandlerInterceptor的afterCompletion方法


实践

  • 打标记/清除标记
1、打标记【preHandle方法】filter类:*InterceptorString traceId = getTraceId(request);MDC.put("traceId", traceId);private String getTraceId(HttpServletRequest request){  return String.format("%s - %s",request.getRequestURI(), UUID.randomUUID());}备注:filter需注入@BeanWebMvcConfigurer createWebMvcConfigurer(@Autowired HandlerInterceptor[] interceptors) {  return new WebMvcConfigurer() {    public void addInterceptors(InterceptorRegistry registry) {      for (HandlerInterceptor interceptor : interceptors) {        registry.addInterceptor(interceptor);      }    }  };}2、清除标记【afterCompletion方法】MDC.clear();
  • logback【见上一篇logback文章】
<?xml version="1.0" encoding="UTF-8"?>                ./log/${LOG_FILE}.log                                ./log/${LOG_FILE}.%d{yyyy-MM-dd}.gz                        30                        100MB                                         %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{50} %L - %msg%n                                     %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{50} %L - %msg%n                                备注:%X{traceId}  : 标记的使用和输出。


资料

https://logbackcn.gitbook.io/logback/08-di-ba-zhang-mdc【强烈推荐logback详解】

https://zhuanlan.zhihu.com/p/61395047

https://www.cnblogs.com/cjsblog/p/11831046.html

https://logback.qos.ch/manual/mdc.html


其实啊,logback 的中文手册一篇足以,都来自于它的变体或实践。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章