在log4j中记录用户名

时间:2011-12-18 19:23:32

标签: logging log4j mdc

我需要在log中打印用户名和客户端IP地址。但是用户名仅在log4j中使用MDC打印第一个线程。从下一个线程开始,值打印为空。任何人都可以建议如何进一步发展。

1 个答案:

答案 0 :(得分: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();
    }
}

每次请求跳转到不同的线程时,您必须执行类似的注册。再次 - 清理非常重要。