[英]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
中:
boolean java1 = true
class 变量;isJava1()
方法更改为始终返回true
;java1
变量的位置必须调用isJava1()
方法。现在 MDC 适用于 Log4j1 + Java9+。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.