java - 如果 Java 版本是 11、11.1x 等,为什么 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")
按照预期,应该记录 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 将无法工作。这看起来不像一个错误吗?
解决方案
这是一个错误。但是,Log4j 自 2015 年 8 月 5 日(http://logging.apache.org/log4j/1.2/)起被标记为生命周期结束,并且
建议使用 Log4j 1 的用户升级到 Apache Log4j 2
具体来说,MDC 和 Java 9 的问题是众所周知的:Log4j 1.2 在 Java 9 上被破坏了,但不太可能有人会修复这个问题。
推荐阅读
- java-native-interface - ZeroMQ 作为 JNI 的替代品?
- c# - 如果日期相差一天,则合并列表元素
- java - 我如何转一套
在Java中变成一个字符串? - google-apps-script - 为股票交易创建自动损益表 (GS)
- react-native - React-native ScrollView scrollTo 无法正常工作
- javascript - 无论 URL 是什么,React 路由器都粘在一个组件上
- javascript - 如何用另一个数组的值替换第一个数组的值?
- c++ - unique_ptr 和错误:运行时检查失败 #2 - QT 中变量“w”周围的堆栈已损坏
- curl - 使用 curl 窗口在带有 curl 请求的 BOX 中创建文件夹时出错
- flutter - 参数类型“editingtextcontroller”不能分配给参数类型“字符串”