介绍
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 版权协议,转载请附上原文出处链接和本声明。