2015-11-16 51 views
0

我試圖將我的項目中的日誌記錄系統從log4j升級到log4j2。在原始項目中,記錄器初始化期間,正在使用MDC將用戶名和域名設置爲日誌。Log4j2線程上下文不持久跨類

MDC.put("domain", domain); 
MDC.put("user", user); 

當我搬到log4j2時,MDC被ThreadContext所取代。

ThreadContext.put("domain", facility); 
ThreadContext.put("user", user); 

雖然它在設置ThreadContextMap的類中記錄的很好。但是Map不會在使用相同記錄器的其他類中持久化。 MDC不是這種情況。

Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
     <File name="file" fileName="app.log"> 
      <PatternLayout> 
       <Pattern>%d{MM/dd/yyyy HH:mm:ss} | %p | %X{user} | %X{domain} | %c %m%n</Pattern> 
      </PatternLayout> 
     </File> 

    </Appenders> 
    <Loggers> 
     <Root level="trace"> 
      <AppenderRef ref="file" level="DEBUG"/> 
      <AppenderRef ref="file" level="INFO"/> 
     </Root> 
    </Loggers> 
</Configuration> 

app.log

11/16/2015 16:09:59 | INFO | xxxx| unknown | test [ID:10.xxxxxxxx]: Test1 
11/16/2015 16:09:59 | INFO | | | test | [ID:10.xxxxxxxx]: Test2 
11/16/2015 16:09:59 | INFO | | | test | [ID:10.xxxxxxxx]: Test3 
+0

是什麼意思「不堅持」的ThreadContect只是一個ThreadLocal,所以一旦您設置的值,他們將持續在該線程,直到排除ThreaadContext。其他線程將不會有值,除非你設置它們。 – rgoers

+0

查看此文檔https://logging.apache.org/log4j/2.x/manual/migration.html。 MDC和NDC已被ThreadContext所取代,我認爲這些地圖的工作方式是相同的。我切換到Sys:變量而不是用於應用程序範圍。 – UglyCode

+0

ThreadContext Map應具有與MDC類似的行爲。你能提供一些代碼來顯示問題嗎?如果你在這裏不能這樣做,你可以打開一個Jira問題並附加到那裏。 – rgoers

回答

0

ThreadContext地圖是不會繼承到子線程。您可能需要將值設置爲子線程中的ThreadContext,或者嘗試此處提及的方法(請參閱實現細節段落)以使其可繼承。

https://logging.apache.org/log4j/2.x/manual/thread-context.html

+1

歡迎使用stackoverflow,當回答問題時,嘗試從外部添加資源時提供上下文甚至簡化的解決方案。該鏈接可能會改變,消失,甚至使人難以看到答案,然後必須在其他地方搜索它。 – Bonatti

+0

相反,根據Log4j2 API文檔,地圖被繼承到子線程:https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/ ThreadContext.html – nucatus