0

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

  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>
4

1 回答 1

1

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

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

于 2015-02-08T21:00:56.707 回答