添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Mapped Diagnostic Context (MDC) 是主流 log 框架自带的功能,将某些信息存在 context 中,然后反映到日志中去。

用的好的话,可以使得日志看起来有条理很多。

一个 batch processing 的应用,每个批次都有一个特定的 DATASET ID。想要(跨多个文件)打出如下的日志:

08:30:00.100 [DATASET 123456] INFO this is message 1
08:30:00.200 [DATASET 123456] INFO this is message 2
08:30:00.300 [DATASET 123456] INFO this is message 3
08:30:00.400 [DATASET 123456] INFO this is message 4
08:30:00.500 [DATASET 123456] INFO this is message 5

可以使用Thread.setName如下:

Thread.currentThread().setName( "DATASET 123456" );

但是,Thread.setName是比较"重"的操作,有没有什么更轻量的方法呢?

有的,是使用MDC

Java 部分代码,使用MDC.put

import org.slf4j.MDC;
MDC.put("context", "DATASET 123456");
// some logic
MDC.clear();

日志配置文件(以 logback 为例),加入%X{PUT_HERE_THE_KEY_NAME}

<encoder>
	<pattern>%d{HH:mm:ss.SSS} [%X{context}] %-5level %logger{36}.%M\(%line\) - %msg%n</pattern>
</encoder>

一定,记得用完要清理:clear()

否则,多线程的情况下,context 可能被下一个线程使用。(背后,MDC 使用 ThreadLocals 方式实现)

  • mdc-in-log4j-2-logback https://www.baeldung.com/mdc-in-log4j-2-logback
  •