java - log4j FileAppender 是线程安全的吗?我可以即时更改文件名吗?

标签 java tomcat logging log4j mdc

我运行一个部署在 Tomcat 中的 Java 网络应用程序。我们使用 commons-logging 作为 log4j v1.2.16

的包装器

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

他们在 GET 字符串中传递他们的用户名,我们很容易得到这个,将它添加到 MDC,然后通过 在文件中的日志消息之前打印它转换模式

我们现在希望为我们跟踪的每个用户创建一个文件,我的解决方案是为所有日志记录指向的 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 写入多个日志文件(我们是否应该记录,如果是的话要使用的文件名)?

最佳答案

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

关于java - log4j FileAppender 是线程安全的吗?我可以即时更改文件名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549037/

相关文章:

Javadoc源文件解析

java - 如何在java中获取S3中文件的最新时间

perl - 如何在 Perl DBI 日志文件中获取时间戳?

c# - 登录多线程环境并测试

r - 将信息打印到shiny-server日志中

java - 使用 jpackage 实用程序进行代码签名+公证在 macOS 上不起作用

java - 为什么 BufferedReader 不缓冲输入?

tomcat - 如何拒绝对 Tomcat 目录的 Web 访问

java - Tomcat/IIS 在 http 响应完成后关闭套接字

javascript - Tomcat不压缩js文件