我需要在日志中打印用户名和客户端 IP 地址。但用户名仅打印在 log4j 中使用 MDC 的第一个线程。从下一个线程开始,值打印为空。任何人都可以建议如何在这方面进一步进行。
问问题
2996 次
1 回答
1
MDC用于ThreadLocal
存储值。也许 Log4J (如Logback)使用InheritableThreadLocal
它部分解决了像你这样的问题:新创建的线程从父线程继承 MDC。
我猜您正在使用某种池(我们很少在 EE 环境中创建专用线程,因此继承 MDC 不仅无济于事,而且当池按需增长时可能会引起很多混乱)。不幸的是,在这种情况下,您需要在切换到新线程时显式设置 MDC。更重要的是,你需要在它之后进行清理,否则池线程会被旧的 MDC“污染”。
例如,当从包含有效 MDC 值的 Web 线程发送 JMS 消息时,您必须将所需的 MDC 值添加到消息头中。然后,当您收到 JMS 消息(在 JMS 线程中)时,您需要手动检索这些值并注册它们:
public void onMessage(Message message) {
MDC.put("user", message.getStringProperty("user"));
try {
//handle the message
} finally {
MDC.clear();
}
}
每次您的请求跳转到不同的线程时,您都必须执行类似的注册。再一次 - 清理是非常重要的。
于 2011-12-18T19:49:43.063 回答