我正在使用JBOSS7。我將一些關於SOAP請求的信息存儲在一個ThreadLocal變量中,以便將它添加到log4j頭文件中。在JBOSS上重新部署EJB後無法設置ThreadLocal
我的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.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()的結果也是null。
如果我重新啓動JBOSS,那麼在我重新部署EJB之前,所有事情都可以正常工作。 我不太清楚爲什麼會發生這種情況。或者有沒有比ThreadLocal更好的將信息傳遞給log4j RollingFileAppender的方法?
感謝, 五
我試了一下在GlassFish過,結果是一樣的...... – Viktor
的問題可能是,MyRollingFileAppender在不同的執行重新部署後的線程。我會嘗試一個不同的日誌框架。任何我應該嘗試的建議? – Viktor