首页 > 解决方案 > 如果 Java 版本是 11、11.1x 等,为什么 log4j 停止运行 MDC 逻辑

问题描述

我使用 MDC 来帮助 log4j 记录更多信息。在我将 java 版本更新到 11 之前一切正常。这是我的 log4j 配置(伪代码)

log4j.appender.R.layout.ConversionPattern = [%-4p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%X{request-id}] %l %m%n

这就是我为 MDC 所做的

MDC.put("request-id","example-request-id")

按照预期,应该记录 request-id。但是,如果 Java 版本为 11,则它不起作用。

以下是我从 log4j 代码中的发现。

“org.apache.log4j.helpers.Loader”中有一段代码可以设置java1

    String prop = OptionConverter.getSystemProperty("java.version", null);
    
    if(prop != null) {
      int i = prop.indexOf('.');
      if(i != -1) { 
        if(prop.charAt(i+1) != '1')
        java1 = false;
      } 
    }

然后,“org.apache.log4j.MDC#MDC”中的一些代码停止逻辑。

void put0(String key, Object o) {
    if(java1 || tlm == null) {
      return;
    }
...
}

总之,如果 java 版本是 11,12,13,..., 11.1x, 12.1x,..., 等,MDC 将无法工作。这看起来不像一个错误吗?

标签: javalog4jmdc

解决方案


这是一个错误。但是,Log4j 自 2015 年 8 月 5 日(http://logging.apache.org/log4j/1.2/)起被标记为生命周期结束,并且

建议使用 Log4j 1 的用户升级到 Apache Log4j 2

具体来说,MDC 和 Java 9 的问题是众所周知的:Log4j 1.2 在 Java 9 上被破坏了,但不太可能有人会修复这个问题。


推荐阅读