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

标签 java 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")

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

最佳答案

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

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

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

关于java - 如果 Java 版本为 11、11.1x 等,为什么 log4j 停止运行 MDC 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69822992/

相关文章:

logging - slf4j-jdk14 从哪里获取日志配置?

java - 如何在log4j2中实现自定义模式布局

Java多线程应用程序System.out.println产生延迟

java - 无法将值放入 M​​DC

java - 未从资源包获取消息

java - 如何根据 1 小时间隔获取时间段

java - 多线程系统中的Logback和MDC

java - CommonPool 而非自定义池中的 ParallelStream 队列任务

java - 删除标点符号,保留字母和空格 - Java Regex

java - java中栈的实现