【问题标题】:Logging username in log4j在 log4j 中记录用户名
【发布时间】:2011-12-18 19:23:32
【问题描述】:

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

【问题讨论】:

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

标签: logging log4j mdc


【解决方案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();
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多