MDC的使用

  • Post author:
  • Post category:其他


介绍

MDC(Mapped Diagnostic Contexts) 映射调试上下文 ,用于多线程条件下追踪日志功能。

支持 Log4J和LogBack 两种日志框架

原理

MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。

微服务之间的调用,则需要上层服务在 header 中添加标识同请求一起传输过来。下层服务直接使用上层服务的标识,就可以将日志串联起来。

使用

依赖

支持 Log4J和LogBack 两种日志框架

<dependency>  
  <groupId>log4j</groupId>  
  <artifactId>log4j</artifactId>  
  <version>1.2.17</version>  
</dependency>  
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-log4j12</artifactId>  
    <version>1.7.21</version>  
</dependency>

java

MDC.put("uuid" , xxxx);//自定义唯一标识
MDC.clear();

logback.xml

//打印时,打印唯一标识,通过唯一标识定位线程日志
<pattern>%boldRed(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%level |) %msg | %X{uuid}\n\tat %boldMagenta(%class).%boldCyan(%method) \(%file:%line\) \)\n\</pattern>

注意事项

主线程中使用线程池会导致线程池中丢失MDC信息,需要重写线程池,把主线程的MDC信息写到子线程中。



版权声明:本文为qq_38154587原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。