0

これまで、log4j1.2 を使用して同期的にログを記録している Web アプリケーションがあります。async-appenderを使用するように移動しようとしています(log4j 1.2から)。async-appender を初期化する log4j.xml という XML ファイルを作成しました。ただし、ログを確認すると、リクエストの 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 を読み取る必要があります。現在のスレッドの MDC からリクエスト ID とそのような値を読み取ろうとするカスタム PatternLayout がありました。本質的には、アプリケーション スレッドを生成するメイン スレッドがそれぞれの MDC に値を設定していたため、同期ロギングでのみ機能します。 .

Async-appender スレッドの MDC には (キー、値) ペアが設定されていませんでしたが、渡された LoggingEvents の mdcCopy には (キー、値) ペアが含まれていました。

于 2015-02-08T21:00:56.707 に答える