MDC 中设置的变量在 log4j2 中无法访问

问题描述 投票:0回答:1

我有一个 spring MVC 项目(不是 springboot )。我正在尝试使用 MDC 添加用于日志记录的traceId

(MDC.set("X_REQUEST_ID",uuid.randomuuid().tostring())
。现在我已经添加了在 Filter 类中设置变量(X_REQUEST_ID)的代码。在 log4j2.xml 中,我将模式添加为

%d{yyyy-MMM-dd HH:mm:ss.SSSSSS} [%X{X_REQUEST_ID}] [%t] %-5p %c

但是当我运行该项目时,其打印 [ ]X_REQUEST_ID 这意味着没有值。

我已经测试了代码,但使用了 MDC.get("X_REQUEST_ID") 并且它的设置正确且可见,如代码中所示。

我正在使用 org.apache.log4j.MDC,下面是我的依赖项。

 <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.17.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.17.0</version>
    </dependency>
spring spring-mvc log4j2 trace mdc
1个回答
0
投票

您使用了错误的 API:

org.apache.log4j.MDC
是 Log4j 1 类,仅由 Log4j 1 使用。

您需要使用的是

org.apache.logging.log4j.ThreadContext
(参见文档):

try {
    ThreadContext.put("X_REQUEST_ID", UUID.randomUUID().toString());
    // your code
} finally {
    ThreadContext.remove("X_REQUEST_ID");
}

备注:您可以考虑使用

log4j-1.2-api
桥(参见 迁移),它将把
MDC
调用转发到
ThreadContext
调用,但是
MDC
通常使用的次数很少,因此不值得额外的依赖。

© www.soinside.com 2019 - 2024. All rights reserved.