2015-02-08 76 views
0

我有一個web應用程序已使用log4j1.2到目前爲止同步記錄。我試圖將它移動到使用異步appender(從log4j 1.2)。我寫了一個XML文件 - log4j.xml,它初始化async-appender。但是,當我檢查日誌時,我發現請求的ID未被記錄(儘管它迄今爲止已被記錄)。經過一番調查後,我認爲MDC中不存在請求ID的(密鑰,值)對。請求ID沒有登錄移動到log4j 1.2的異步appender

  1. 這是因爲async-appender是一個單獨的線程,並沒有繼承與主應用程序線程相同的鍵值對嗎?
  2. 有沒有一種方法可以在MDC中設置這些值,以便應用程序再次開始記錄請求ID?

供參考的log4j.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> 
    <appender name="Async" class="org.apache.log4j.AsyncAppender"> 
     <appender-ref ref="FILE"/> 
    </appender> 

    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> 
     <param name="File" value="/log/directory/logFile"/> 
     <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/> 
     <param name="Append" value="true" /> 

     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%-5p] %c %x - %m%n" /> 
     </layout> 
    </appender> 

    <root> 
     <priority value="warn"/> 
     <appender-ref ref="Async"/> 
    </root> 
</log4j:configuration> 

回答

1

採用異步的appender,你需要閱讀mdcCopy關閉傳遞到異步線程的Appender將LoggingEvent所。我有一個自定義的PatternLayout,用於嘗試從當前線程的MDC中讀取請求ID和這些值 - 實質上,它只能用於同步日誌記錄,因爲生成應用程序線程的主線程將值設置到各自的MDC中。

Async-appender線程的MDC沒有設置(key,value)對,但傳遞給它的LoggingEvents在它的mdcCopy中確實有(key,value)對。