移动到log4j 1.2&#as; async-appender时未记录请求ID

时间:2015-02-08 17:50:52

标签: java log4j mdc

到目前为止,我有一个使用log4j1.2同步登录的Web应用程序。我试图将其移动到使用async-appender(来自log4j 1.2)。我编写了一个XML文件 - 初始化async-appender的log4j.xml。但是,当我检查日志时,我看到请求的ID未被记录(尽管到目前为止它已被记录)。经过一些调查后,我认为请求ID的(键,值)对不再出现在MDC中。

  1. 是因为async-appender是一个单独的线程,并且没有继承与主应用程序线程相同的键值对吗?
  2. 有没有办法在MDC中设置这些值,以便应用程序再次开始记录请求ID?
  3. 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 个答案:

答案 0 :(得分:1)

使用Async-appender,您需要读取传递给Async Appender线程的LoggingEvent的mdcCopy。我有一个自定义的PatternLayout,用于尝试从当前线程的MDC读取请求ID和此类值 - 实质上,它只适用于同步日志记录,因为生成应用程序线程的主线程将值设置为相应的MDC 。

Async-appender线程的MDC没有设置(key,value)对,但传递给它的LoggingEvents在其mdcCopy中确实有(key,value)对。