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.