Log4j:它是否为多线程调用同步?

she*_*ill 17 java jboss multithreading log4j synchronized

我们遇到了一个有趣的问题,我们在对系统进行压力测试时注意到了这个问题.我们正在大量使用log4j(在JBOSS中)进行日志记录.这是我们一些日志记录的天真例子

void someFunction()
{
Log.info("entered some function");
...

Log.info("existed some function");
}
Run Code Online (Sandbox Code Playgroud)

现在我们注意到的有趣的事情是,如果我们针对此函数启动100个线程; Log.info()调用是每个线程阻塞..意味着线程2正在等待thread1完成"Log.info"调用.在线程100的情况下; 它最终等待了很长时间..我们正在使用本机文件记录器.

这是一个已知的问题?

Tom*_*icz 12

Log4J必须同步,否则您会在文件中看到交错和乱码的日志消息.但至少在Logback中只有appender是同步的,而不是整个日志消息(所以计算有效的日志级别,日志消息等是多线程的).

但是,即使同步被删除,I/O也会成为瓶颈,因为它本质上是单线程的.因此,考虑减少日志记录量,因为文件访问速度很慢,而不是Log4J.

您可能还有兴趣AsyncAppender在一个不同的线程中对日志记录消息进行排队.

  • +1 - 我认为值得一提的一件事是与异步方法的权衡; 在进程或系统崩溃的情况下,您无法保证所有日志记录都已进入磁盘 (2认同)

The*_*ail 2

您可能想要的是异步日志记录,请参阅这篇文章了解如何实现这一点:

使用 log4j 进行异步日志记录

另外,请考虑使用正确的日志级别。和语句通常应该在级别上记录,这在调试时可能很方便(然后将configure log4j也设置为在级别上记录entered...)。在生产环境中,您可能希望告诉 log4j 仅从级别或进行记录,从而避免不必要的日志操作。exi(s)ted...TRACETRACEINFODEBUG

另请参阅有关 log4j 性能的问题:

log4j 性能