私のアプリケーションでは、数十万行のコードで実行されるアプリケーションでは、すべてのログステートメントで一意のID(要求ID)を記録しています。マルチスレッドの性質と複数のリクエストがあるとすれば、なぜこのリクエストIDを最初にログに記録しても動作しないのがわかります。その間に他のリクエストが来る可能性があるため、ログが混在します。log4j2を使用して一意のIDを繰り返し記録することを避ける方法
これをlog4j2で行う方法はありますか。
私のアプリケーションでは、数十万行のコードで実行されるアプリケーションでは、すべてのログステートメントで一意のID(要求ID)を記録しています。マルチスレッドの性質と複数のリクエストがあるとすれば、なぜこのリクエストIDを最初にログに記録しても動作しないのがわかります。その間に他のリクエストが来る可能性があるため、ログが混在します。log4j2を使用して一意のIDを繰り返し記録することを避ける方法
これをlog4j2で行う方法はありますか。
これは一般的な問題で、Log4j2ではThreadContextマップを使用して解決できます。
要求はあなたのコードを入力し、はThreadContextでユニークなID設定:ここから
ThreadContext.put("id", uniqueID());
を、同じスレッドで起こるすべてのログは、キーとして「ID」で地図を持っていますあなたが指定した値。これはfiltering、routingに使用でき、ログファイルには%X
の会話パターンでマップを表示させることができます。特定のキー(たとえば「id」)のみが必要な場合は、pattern layoutに%X{id}
を使用してください。
完了したら、ThreadContext.remove("id")
でキーを削除します。
最近、Log4j2にはCloseableThreadContextが追加され、キーと値のペアは自動的に削除されます。
こんにちはレムコ。これはこのリクエストの適切な場所ではありませんが、http://stackoverflow.com/questions/41746157/log4j2-setting-printobject-to-true-in-custom-appenderをご覧ください。チャンス。 – Andy897
大丈夫ですが、スーパービジーです。時間をください。 –
マップされたDignostic Context(MDC)を見てください。これは、基本的に同じスレッドによって記録されたすべてのメッセージに追加されるThreadLocalです。それをパターンに含める必要があります。また、MDCをクリアすることを忘れないでください。
ウェブアプリケーションでは、通常、フィルタによって行われます。
Log4J 2の外観[こちら](https://logging.apache.org/log4j/2.x/manual/thread-context.html)。 –
ユニークなIDをどのように生成していますか? – fabfas
発信者がそれをサービスに渡します。 – Andy897