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 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。

4

1 回答 1

1

解决方案是摆脱 log4j 并使用 logback。我也尝试在 log4j 中使用 MDC,但结果相同。在 logback 中,MDC 完美运行。重新部署后,可能 MyRollingFileAppender 正在 log4j 的不同线程中执行......

于 2013-05-23T14:06:12.267 回答