簡體   English   中英

如果 Java 版本為 11、11.1x 等,為什么 log4j 停止運行 MDC 邏輯

[英]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中:

  • 此處評論 static 塊中處理 java 版本的部分;
  • 注釋boolean java1 = true class 變量;
  • isJava1()方法更改為始終返回true
  • 引用java1變量的位置必須調用isJava1()方法。

現在 MDC 適用於 Log4j1 + Java9+。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM