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在一个不同的线程中对日志记录消息进行排队.
您可能想要的是异步日志记录,请参阅这篇文章了解如何实现这一点:
另外,请考虑使用正确的日志级别。和语句通常应该在级别上记录,这在调试时可能很方便(然后将configure log4j也设置为在级别上记录entered...)。在生产环境中,您可能希望告诉 log4j 仅从级别或进行记录,从而避免不必要的日志操作。exi(s)ted...TRACETRACEINFODEBUG
另请参阅有关 log4j 性能的问题: