1

私のソフトウェアのタスクにはいくつかのステップが含まれており、各ステップは異なるスレッドで実行される場合と実行されない場合があります。各ステップにはいくつかのログがあり、ログ サービスとして log4j を使用します。

頭の痛い問題は、異なるスレッドによって出力されたログをそれらが属するタスクに関連付けるのが難しいことです。シングル スレッド モードでは、スレッド名は適切な指標ですが、マルチ スレッド モードでは機能しません。煩わしく、プログラマーに負担がかかるため、スレッドを介してタスクインジケーターを渡したくありません。

誰かが同じ問題に直面し、良い解決策を持っていたのだろうか? ありがとうございました。

4

2 に答える 2

1

MDC (Mapped Diagnostic Context) および NDC (Nested Diagnostic Context) に関するlog4j のドキュメントを探してください。以下、本記事より抜粋

ネストされた診断コンテキスト (NDC) とマップされた診断コンテキスト (MDC) は、1 つのアプリケーションが複数のクライアントに同時にサービスを提供することに関与しており、これらの複数のクライアントのそれぞれからログ コンテンツを分離または区別することに関心がある場合に役立ちます。Web アプリケーションは、このような状況の非常に良い例です。

では、コンテンツを複数のクライアントから分離または区別するにはどうすればよいでしょうか。クライアント固有の情報で各ログ ステートメントをマークすることによって。典型的な Web アプリケーションでは、これには、とりわけクライアントの IP アドレスが含まれる可能性があり、サーブレット コンテナーですぐに使用できます。したがって、NDC では、コンテキストに入るときにこの情報をスタックにプッシュし、そのコンテキストを離れるときにポップします。log4j は、関連付けられたレイアウトで %x 変換パターンを使用する場合、アペンダーに書き込むときにこのコンテキスト固有の情報を使用します。

于 2012-06-11T20:46:19.297 に答える
0

この目的のために作成された org.apache.log4j.MDC と org.apache.log4j.NDC の 2 つのクラスがあります。Javadoc を参照してください: NDCおよびMDC

于 2012-06-11T20:54:33.580 に答える