Logging 在log4j中记录用户名

Logging 在log4j中记录用户名,logging,log4j,mdc,Logging,Log4j,Mdc,我需要在日志中打印用户名和客户端IP地址。但用户名是,仅在log4j中使用MDC为第一个线程打印。从下一个线程开始,值打印为空。任何人都可以建议如何进一步处理此问题。用于存储值。也许Log4J(like)使用了它,部分解决了像您这样的问题:新创建的线程从父线程继承了MDC 我猜您正在使用某种类型的池(我们很少在EE环境中创建专用线程,因此继承MDC不仅没有帮助,而且在池按需增长时可能会造成很多混乱)。不幸的是,在这种情况下,切换到新线程时需要显式设置MDC。更重要的是,您需要在它之后进行清理,否

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

用于存储值。也许Log4J(like)使用了它,部分解决了像您这样的问题:新创建的线程从父线程继承了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();
    }
}

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

1-您如何决定下一个线程?如果是下一个请求,它应该通过将值放入MDC的代码。请确保只有在请求/线程即将完成时才从MDC中删除这些值。