2017-01-17 27 views
1

私のアプリケーションでは、数十万行のコードで実行されるアプリケーションでは、すべてのログステートメントで一意のID(要求ID)を記録しています。マルチスレッドの性質と複数のリクエストがあるとすれば、なぜこのリクエストIDを最初にログに記録しても動作しないのがわかります。その間に他のリクエストが来る可能性があるため、ログが混在します。log4j2を使用して一意のIDを繰り返し記録することを避ける方法

これをlog4j2で行う方法はありますか。

+0

ユニークなIDをどのように生成していますか? – fabfas

+0

発信者がそれをサービスに渡します。 – Andy897

答えて

1

これは一般的な問題で、Log4j2ではThreadContextマップを使用して解決できます。

要求はあなたのコードを入力し、はThreadContextでユニークなID設定:ここから

ThreadContext.put("id", uniqueID()); 

を、同じスレッドで起こるすべてのログは、キーとして「ID」で地図を持っていますあなたが指定した値。これはfilteringroutingに使用でき、ログファイルには%Xの会話パターンでマップを表示させることができます。特定のキー(たとえば「id」)のみが必要な場合は、pattern layout%X{id}を使用してください。

完了したら、ThreadContext.remove("id")でキーを削除します。

最近、Log4j2にはCloseableThreadContextが追加され、キーと値のペアは自動的に削除されます。

+0

こんにちはレムコ。これはこのリクエストの適切な場所ではありませんが、http://stackoverflow.com/questions/41746157/log4j2-setting-printobject-to-true-in-custom-appenderをご覧ください。チャンス。 – Andy897

+0

大丈夫ですが、スーパービジーです。時間をください。 –

0

マップされたDignostic Context(MDC)を見てください。これは、基本的に同じスレッドによって記録されたすべてのメッセージに追加されるThreadLocalです。それをパターンに含める必要があります。また、MDCをクリアすることを忘れないでください。

ウェブアプリケーションでは、通常、フィルタによって行われます。

+0

Log4J 2の外観[こちら](https://logging.apache.org/log4j/2.x/manual/thread-context.html)。 –

関連する問題