我試圖將我的項目中的日誌記錄系統從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
是什麼意思「不堅持」的ThreadContect只是一個ThreadLocal,所以一旦您設置的值,他們將持續在該線程,直到排除ThreaadContext。其他線程將不會有值,除非你設置它們。 – rgoers
查看此文檔https://logging.apache.org/log4j/2.x/manual/migration.html。 MDC和NDC已被ThreadContext所取代,我認爲這些地圖的工作方式是相同的。我切換到Sys:變量而不是用於應用程序範圍。 – UglyCode
ThreadContext Map應具有與MDC類似的行爲。你能提供一些代碼來顯示問題嗎?如果你在這裏不能這樣做,你可以打開一個Jira問題並附加到那裏。 – rgoers