SpringBoot+slf4j实现全链路调用日志跟踪的方法(一)
SpringBoot中除了常见的分布式链路跟踪系统zipkin、skywalking等,如果需要快速定位一次请求的所有日志,那么该如何实现?实际slf4j提供了MDC(Mapped Diagnostic Contexts)功能,支持用户定义和修改日志的输出格式以及内容。本文将介绍 Tracer集成的slf4j MDC功能,方便用户在只简单修改日志配置文件的前提下输出当前 Tracer 上下文 TraceId。
MDC介绍MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。
springboot中如何使用添加拦截器
public class LogInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {String tid = UUID.randomUUID().toString().replace('-', '');MDC.put(CloudConstant.MDC_TRACE, tid);return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {MDC.remove(CloudConstant.MDC_TRACE);}}
注册拦截器
@Configurationpublic class WebInterceptorAdapter implements WebMvcConfigurer {@Beanpublic LogInterceptor logInterceptor() {return new LogInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(logInterceptor());}}
修改日志输出格式,添加%X{traceId},traceId和MDC中的键名称一致
<pattern>%date %-5level ${PID:- } [%thread] [%X{tid}] : /*[%logger{50}:%line] %msg*/%n</pattern>
添加一个controller调用测试
@RestController@RequestMapping('trace')@Slf4jpublic class TestTraceController { @GetMapping('traceLog') public String traceLog() {log.info('---接口调用了---');traceService();return 'success'; } private void traceService(){log.error('## 执行traceService方法'); }}
日志打印如下,我们可以通过traceId快速查找出同一个请求的所有日志
细心的同学就会发现,MDC还是存在一些问题
在子线程中打印日志丢失traceId HTTP调用丢失traceId在下一篇文章中小编继续讲解子线程中如何实现traceId的日志跟踪
到此这篇关于SpringBoot+slf4j实现全链路调用日志跟踪 一的文章就介绍到这了,更多相关SpringBoot全链路调用日志跟踪内容请搜索好吧啦网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好吧啦网!
相关文章:
1. React中的合成事件是什么原理2. Vue Element UI 表单自定义校验规则及使用3. 用css截取字符的几种方法详解(css排版隐藏溢出文本)4. CSS3实例分享之多重背景的实现(Multiple backgrounds)5. 在 XSL/XSLT 中实现随机排序6. ie6,ie7,ie8完美支持position:fixed的终极解决方案7. CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chrome、Opera8. CSS可以做的几个令你叹为观止的实例分享9. 《CSS3实战》笔记--渐变设计(一)10. chatGPT教我写compose函数的详细过程
