0

JBOSS7を使用しています。SOAP リクエストに関する情報を ThreadLocal 変数に保存して、log4j ヘッダーに追加します。

私の ThreadLocal クラス:

class MyStorage
private static final ThreadLocal<String> storage = new ThreadLocal<String>();

public static void setRequestId(String requestId) {
    storage.set(requestId);
}

public static String getRequestId() {
    return storage.get();
}

...
}

私のlog4jアペンダークラス:

public class MyRollingFileAppender extends RollingFileAppender {

@Override
public void append(LoggingEvent event) {
    String reqId = MyStorage.getRequestId();
    event.setProperty("reqId", reqId == null ? "UNKNOWN" : reqId);
    super.append(event);
}
}

log4j.プロパティ:

log4j.appender.Throttling.layout.ConversionPattern=[%d{HH:mm:ss,SSS}] (%properties{reqId}) (%t) [%-5p] [%c]: %m%n

最初に JBOSS を起動して EJB をデプロイすると、すべて正常に動作します。ログ ヘッダーに正しい requestId が表示されます。しかし、EJB を再デプロイすると、ログ (MyStorage のメソッドに System.out.println() を追加した) に、requestId の正しい値がメソッド MyStorage.setRequestId(...) に渡されたことがわかりますが、ログ ヘッダーの requestId の値は UNKNOWN です。さらに、 MyStorage.getRequestId() の結果も null です。

JBOSS を再起動すると、EJB を再デプロイするまで、すべて正常に動作します。なぜこれが起こっているのかよくわかりません。または、ThreadLocal よりも log4j RollingFileAppender に情報を渡すより良い方法はありますか?

ありがとう、V.

4

1 に答える 1

1

解決策は、log4j を取り除き、logback を使用することでした。log4jでもMDCを使用しようとしましたが、同じ結果になりました。logback では、MDC は完全に機能します。おそらく MyRollingFileAppender は、再デプロイ後に log4j の別のスレッドで実行されています...

于 2013-05-23T14:06:12.267 に答える