[英]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.