如果 Java 版本是 11、11.1x 等,为什么 log4j 会停止 运行 MDC 逻辑

Why log4j stop running MDC logic if Java version is 11, 11.1x, etc

我使用 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")

按预期,应该记录了请求 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 将无法工作。这看起来不像是一个错误吗?

这是一个错误。但是,自 2015 年 8 月 5 日 (http://logging.apache.org/log4j/1.2/) 和

起,Log4j 被标记为生命周期结束

Users of Log4j 1 are recommended to upgrade to Apache Log4j 2

特别是 MDC 和 Java 9 的问题是众所周知的:Log4j 1.2 is broken on Java 9,但不太可能有人会解决这个问题。

如果您出于某种原因无法切换到 log4j2 或无法使用其他日志提供程序,则可以将 org.apache.log4j.helpers.Loader class 从 log4j1 复制到您的项目中,保留原始包名称(org.apache.log4j.helpers).

然后在你项目的Loader.java里面:

  • 评论处理java版本的静态块部分,here
  • 注释 boolean java1 = true class 变量;
  • isJava1() 方法更改为始终 return true;
  • 引用 java1 变量的位置必须调用 isJava1() 方法。

现在 MDC 适用于 Log4j1 + Java9+。