2011-12-18 71 views
0

我需要在logs.but中输入用户名和客户端IP地址。但用户名仅在第四个线程中使用MDC在log4j.From下一个线程中打印为空。任何人都可以建议如何进一步处理这一问题。在log4j中记录用户名

+0

1 - 你如何决定下一个线程?如果是下一个请求,它应该通过代码将值放入MDC中的代码。 请确保仅在请求/线程即将完成时才从MDC中删除值。 – 2013-08-06 07:57:19

回答

1

MDC使用ThreadLocal来存储值。也许Log4J(如Logback)使用InheritableThreadLocal,它部分地解决了像你这样的问题:新创建的线程从父线程继承MDC。我猜你正在使用某种池(我们很少在EE环境中创建专用线程,所以继承MDC不仅没有帮助,而且当池按需增长时可能会引起很多混淆)。不幸的是,在这种情况下,您需要在切换到新线程时明确设置MDC。更重要的是,你需要清理后,否则池线程将被旧的MDC“污染”。

例如,当从包含有效MDC值的Web线程发送JMS消息时,您必须添加所需的MDC值,例如,到消息标题中。然后,当您收到JMS消息(JMS中的线程),你需要手动retrive这个值,并把它们注册:

public void onMessage(Message message) { 
    MDC.put("user", message.getStringProperty("user")); 
    try { 
     //handle the message 
    } finally { 
     MDC.clear(); 
    } 
} 

您必须执行每一个你的要求跳进一个不同的线程时间类似的注册。再次 - 清理是非常重要的非常