繁体   English   中英

如果 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")

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

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

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

特别是 MDC 和 Java 9 的问题是众所周知的: Log4j 1.2 在 Java 9 上被破坏了,但任何人都不太可能修复这个问题。

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

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

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

现在 MDC 适用于 Log4j1 + Java9+。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM