我正在使用 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 appender 类:
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.properties:
log4j.appender.Throttling.layout.ConversionPattern=[%d{HH:mm:ss,SSS}] (%properties{reqId}) (%t) [%-5p] [%c]: %m%n
当我首先启动 JBOSS 并部署 EJB 时,一切正常。我可以在日志标题中看到正确的 requestId。但是,当我重新部署 EJB 时,我在日志中看到(我将 System.out.println() 添加到 MyStorage 的方法中) requestId 的正确值已传递给方法 MyStorage.setRequestId(...) 但日志头中 requestId 的值为 UNKNOWN。此外, MyStorage.getRequestId() 的结果也是空的。
如果我重新启动 JBOSS,那么一切都会再次正常工作,直到我重新部署 EJB。我不太确定为什么会这样。还是有比 ThreadLocal 更好的方式将信息传递给 log4j RollingFileAppender?
谢谢,V。