2013-05-20 71 views
0

我正在使用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的方法?

感謝, 五

+0

我試了一下在GlassFish過,結果是一樣的...... – Viktor

+0

的問題可能是,MyRollingFileAppender在不同的執行重新部署後的線程。我會嘗試一個不同的日誌框架。任何我應該嘗試的建議? – Viktor

回答

1

的解決方案是擺脫的log4j和使用的logback。 我試圖在log4j中使用MDC,但是我得到了相同的結果。在logback中,MDC完美工作。 也許MyRollingFileAppender是在不同的線程重新部署後,正在執行中的log4j ...