我正在考虑使用Java日志记录和FileHandler在J2EE Web应用程序中记录业务事件。
我想知道这是否会导致性能瓶颈,因为许多日志记录将写入一个文件。
您的经验和意见是什么?
使用Java日志记录将繁忙的Web应用程序记录到一个文件,而FileHandler可能会成为性能瓶颈吗?
答案 0 :(得分:4)
这完全取决于您添加的日志语句数量。如果在每行代码之后添加日志记录,那么性能肯定会降低。
对重要案例使用日志记录,为当前目的(测试或实际部署)设置正确的日志记录级别,并使用
等构造if (Logger.isDebugEnabled()) {
Logger.debug("Value is " + costlyOperation()")
}
避免调用运行成本高昂的代码。
您可能还想查看this article
答案 1 :(得分:3)
为了避免诸如“依赖于”或“稍微”等一般性,您应该在有和没有日志记录开销的情况下测量应用程序的性能。 Apache JMeter可以帮助您为测试生成负载。
您可以通过记录收集的信息通常对应用程序的完整性至关重要,您无法盲目操作。如果您使用Google Analytics(分析),也会产生轻微的开销,但会带来好处。
为了使日志文件保持合理的大小,您始终可以使用旋转日志文件。
答案 2 :(得分:1)
我认为JavaRevisited博客在性能问题上发表了相当不错的帖子:Top 10 Tips on Logging in Java
答案 3 :(得分:1)
在最近的一个项目中,我将审计事件记录到数据库表中,我担心性能,所以我添加了登录“异步”模式的功能。在此模式下,记录器在低优先级后台线程中运行,从主线程记录的操作只是将日志事件放入队列中,这些队列由后台日志记录线程延迟检索和写入。
然而,只有在处理过程中存在自然的“中断”时,这种方法才有效;如果你的系统一直很忙,那么队列将永远不会被清空。解决此问题的一种方法是根据队列中的日志消息数量使后台线程更加活跃(我还没有实现的增强功能)。
答案 4 :(得分:1)
你应该:
定义适当的性能指标(例如,响应性,吞吐量等)。然后,您应该在关闭所有日志记录然后再打开时测量此指标。差异将是记录的成本。
然后,您应该尝试使用不同的日志记录库及其提供的模式,并记录观察到的差异。
根据我的个人经验,对于我参与的所有三个项目,我发现异步日志记录有助于提高应用程序吞吐量。但这可能不适合你,所以一定要仔细测量后做出决定。
以下内容与您的问题没有直接关系。
我注意到你特意提到了商业日志记录。在这种情况下,您可能还希望保持日志记录的相关性和清洁性,以防您发现日志文件变得越来越大且难以理解。此区域中有a generally accepted design pattern:按功能记录。这意味着业务日志记录(例如,客户请求退款)转到另一个目的地,接口日志记录将转到另一个目的地(例如,用户点击upvote按钮!=用户upvoted答案),并且跨系统调用将进行到另一个目的地(例如,通过支付网关申请许可)。有些人保留包含所有事件的主日志文件,只是为了查看流程的时间表,而有些人则设计日志矿工/抓取器以在需要时构建时间轴。
希望这有帮助,