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

2022-02-25 00:00:00 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/)和

起标记为停产

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

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

相关文章