前言
spring開發(fā)web項(xiàng)目經(jīng)常會查看日志,通常都是根據(jù)每個(gè)http請求來查詢整個(gè)鏈路的日志。
有時(shí)這些請求的參數(shù)都差不多,日志也很相似,很難分辨出是否同一鏈路的請求。
有時(shí)我會根據(jù)線程id來查詢,但是tomcat的線程是復(fù)用的,同一個(gè)線程id對應(yīng)多個(gè)請求鏈路日志,為此還是想辦法為每個(gè)請求分配一個(gè)鏈路id。
原理
- 打標(biāo)記:logback 在 SLF4J API 利用診斷上下文映射 (MDC)為每個(gè)請求打上唯一標(biāo)記。例如:標(biāo)記為traceId。
- 使用標(biāo)記:logback的pattern使用 %X{traceId}。
- 打標(biāo)記時(shí)機(jī):HandlerInterceptor的preHandle方法
- 清除標(biāo)記:HandlerInterceptor的afterCompletion方法
實(shí)踐
- 打標(biāo)記/清除標(biāo)記
1、打標(biāo)記【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、清除標(biāo)記【afterCompletion方法】MDC.clear();
- logback【見上一篇logback文章】
./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} : 標(biāo)記的使用和輸出。
資料
https://logbackcn.gitbook.io/logback/08-di-ba-zhang-mdc【強(qiáng)烈推薦logback詳解】
https://zhuanlan.zhihu.com/p/61395047
https://www.cnblogs.com/cjsblog/p/11831046.html
https://logback.qos.ch/manual/mdc.html
其實(shí)啊,logback 的中文手冊一篇足以,都來自于它的變體或?qū)嵺`。