到目前为止,我有一个使用log4j1.2同步登录的Web应用程序。我试图将其移动到使用async-appender(来自log4j 1.2)。我编写了一个XML文件 - 初始化async-appender的log4j.xml。但是,当我检查日志时,我看到请求的ID未被记录(尽管到目前为止它已被记录)。经过一些调查后,我认为请求ID的(键,值)对不再出现在MDC中。
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>
答案 0 :(得分:1)
使用Async-appender,您需要读取传递给Async Appender线程的LoggingEvent的mdcCopy。我有一个自定义的PatternLayout,用于尝试从当前线程的MDC读取请求ID和此类值 - 实质上,它只适用于同步日志记录,因为生成应用程序线程的主线程将值设置为相应的MDC 。
Async-appender线程的MDC没有设置(key,value)对,但传递给它的LoggingEvents在其mdcCopy中确实有(key,value)对。