ユーザー名とクライアント IP アドレスをログに出力する必要があります。しかし、ユーザー名は、log4j で MDC を使用する最初のスレッドに対してのみ出力されます。次のスレッドから、値は空として出力されます。これをさらに進める方法を提案できますか。
1 に答える
MDCはThreadLocal
値を格納するために使用します。おそらく、Log4J ( Logbackなど) はInheritableThreadLocal
、あなたのような問題を部分的に解決するために使用します: 新しく作成されたスレッドは、親スレッドから MDC を継承します。
ある種のプーリングを使用していると思います (EE 環境で専用スレッドを作成することはめったにないため、MDC の継承は役に立たないだけでなく、プールがオンデマンドで大きくなると多くの混乱を引き起こす可能性があります)。残念ながら、この場合、新しいスレッドに切り替えるときに MDC を明示的に設定する必要があります。さらに重要なことは、後でクリーンアップする必要があることです。そうしないと、プール スレッドが古い MDC で「汚染」されます。
たとえば、有効な MDC 値を含む Web スレッドから JMS メッセージを送信する場合、必要な MDC 値をメッセージ ヘッダーなどに追加する必要があります。次に、(JMS スレッドで) JMS メッセージを受信したら、この値を手動で取得して登録する必要があります。
public void onMessage(Message message) {
MDC.put("user", message.getStringProperty("user"));
try {
//handle the message
} finally {
MDC.clear();
}
}
リクエストが別のスレッドにジャンプするたびに、同様の登録を実行する必要があります。繰り返しますが、クリーンアップは非常に重要です。