2011-12-18 4 views
0

logs.jutでユーザー名とクライアントのIPアドレスを印刷する必要があります。ユーザー名はlog4jのMDCを使用している最初のスレッドに対してのみ表示されます。次のスレッドは値を空白として表示します。どのようにこれをさらに進めるかを提案することができます。log4jのログイン名

+0

1-どのように次のスレッドを決定していますか?次のリクエストであれば、MDCに値を入力するコードを渡す必要があります。 MDCから値を削除しているのは、要求/スレッドが完了するときだけです。 –

答えて

1

MDCは、値を格納するためにThreadLocalを使用します。たぶんLog4J(Logbackのような)はInheritableThreadLocalを使用します。あなたのような問題を部分的に解決します。新しく作成されたスレッドは親スレッドからMDCを継承します。

私はまれにEE環境で専用スレッドを作成しているので、MDCを継承するだけでは役に立ちませんが、オンデマンドでプールが大きくなると混乱が生じるかもしれません。残念ながら、この場合は、新しいスレッドに切り替える際にMDCを明示的に設定する必要があります。さらに重要なのは、後でクリーンアップする必要があります。そうしないと、プールスレッドは古いMDCで汚染されます。

たとえば、有効なMDC値を含むWebスレッドからJMSメッセージを送信する場合、必要なMDC値を追加する必要があります。メッセージヘッダーに追加します。あなたが(JMSスレッドで)JMSメッセージを受信したときに続いて、手動でこの値をretriveし、それらを登録する必要があります。

public void onMessage(Message message) { 
    MDC.put("user", message.getStringProperty("user")); 
    try { 
     //handle the message 
    } finally { 
     MDC.clear(); 
    } 
} 

あなたは同様の登録申請は、別のスレッドにジャンプするたびに実行する必要があります。もう一度 - クリーンアップは非常にです。

関連する問題