【问题标题】:Is the log4j FileAppender thread-safe? Can I change the filename on the fly?log4j FileAppender 是线程安全的吗?我可以即时更改文件名吗?
【发布时间】:2014-10-24 13:38:15
【问题描述】:

我运行一个部署在 Tomcat 中的 Java webapp。我们使用commons-logging 作为log4j v1.2.16 的包装器

我们有许多并发请求访问服务器,并且不希望调试/跟踪记录每个请求。但是,对于某些用户,出于调试原因,我们希望跟踪他们的交易。我们维护一个从数据库驱动的列表,其中用户可以跟踪。当请求命中时,我们检查我们的列表以查看是否应该跟踪。

他们在 GET 字符串中传递他们的用户名,我们可以毫无问题地得到它,将其添加到 MDC,然后通过 ConversionPattern 将其打印在文件中的日志消息之前。

我们现在希望为我们跟踪的每个用户创建一个文件,我对此的解决方案是为 RollingFileAppender 创建一个自定义扩展名,所有日志记录都指向该扩展名。

如果日志级别是trace,我们检查MDC.get("traceOn") 看看我们是否应该输出。

然后我执行以下操作(肮脏的例子):

    String file = "/var/log/tomcat6/application/trace/"+MDC.get("username")+".log";
    this.setFile(file);
    this.activateOptions();

    super.doAppend(event);

我知道 MDC 是基于每个线程的,但是在生产环境中使用 10 个并发线程进行日志记录并可能写入自己的文件是否安全?

如果不是 - 我怎么能实现同样的事情 - 基于 MDC 写入多个日志文件(我们是否应该记录,如果是,则使用文件名)?

【问题讨论】:

    标签: java tomcat logging log4j mdc


    【解决方案1】:

    log4j 是线程安全的。 Log4j 组件设计用于大量多线程系统。 参考:https://logging.apache.org/log4j/1.2/faq.html#a1.7

    自动重新配置:
    从文件配置时,Log4j 能够自动检测对配置文件的更改并重新配置自身。如果在配置元素上指定了 monitorInterval 属性并将其设置为非零值,则将在下一次评估和/或记录日志事件时检查该文件,并且自上次检查以来已经过去了 monitorInterval。下面的示例显示了如何配置属性,以便仅在至少 30 秒后检查配置文件的更改。最小间隔为 5 秒。

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration monitorInterval="30">
    ...
    </Configuration>
    

    参考:http://logging.apache.org/log4j/2.x/manual/configuration.html

    【讨论】:

    • 谢谢。但我特别询问即时更改配置是否安全。是否为每个会话构造了一个新的 Appender 对象?当覆盖构造函数并打印出一条消息时,我无法在输出中看到该消息。
    • 我的肮脏示例确实有效,并且日志似乎到达了正确的位置,但我仍然担心在没有找到可以证明它是安全的文档或实验的情况下部署到生产环境中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2019-05-18
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多