我正在考虑使用 Java 日志记录和 FileHandler 在 J2EE Web 应用程序中记录业务事件。
我想知道这是否会导致性能瓶颈,因为许多日志记录将被写入一个文件。
你有什么经验和看法?
使用 Java 日志记录和 FileHandler 将繁忙的 Web 应用程序记录到一个文件是否可能成为性能瓶颈?
我正在考虑使用 Java 日志记录和 FileHandler 在 J2EE Web 应用程序中记录业务事件。
我想知道这是否会导致性能瓶颈,因为许多日志记录将被写入一个文件。
你有什么经验和看法?
使用 Java 日志记录和 FileHandler 将繁忙的 Web 应用程序记录到一个文件是否可能成为性能瓶颈?
这完全取决于您添加了多少日志语句。如果在每一行代码之后添加日志记录,那么性能肯定会下降。
在重要情况下使用日志记录,为您当前的目的(测试或实际部署)设置正确的日志记录级别,并使用类似的结构
if (Logger.isDebugEnabled()) {
Logger.debug("Value is " + costlyOperation()")
}
避免调用运行成本高的代码。
您可能还想查看这篇文章
为了避免像“它取决于”或“一点点”等一般性,您应该在有和没有日志开销的情况下测量应用程序的性能。Apache JMeter可以帮助您生成测试负载。
您可以通过日志收集的信息通常对于应用程序的完整性非常重要,您不能盲目操作。如果您使用 Google Analytics,也会有一点开销,但好处占上风。
为了使您的日志文件保持在合理的大小范围内,您始终可以使用轮换日志文件。
在最近的一个项目中,我将审计事件记录到数据库表中,并且我担心性能,因此我添加了以“异步”模式登录的功能。在这种模式下,记录器在低优先级的后台线程中运行,并且从主线程进行记录的行为只是将日志事件放入队列中,由后台记录线程延迟检索和写入。
但是,这种方法只有在处理过程中有自然“中断”时才有效;如果您的系统一直很忙,那么队列将永远不会被清空。解决此问题的一种方法是根据队列中日志消息的数量使后台线程更加活跃(我尚未实现的增强功能)。
我认为 JavaRevisited 博客有一篇关于性能问题的非常好的帖子:Java 日志记录的 10 大技巧
你应该:
定义适当的性能指标(例如,响应能力、吞吐量等)。然后,您应该在关闭然后再打开所有日志记录的情况下测量此指标。不同之处在于记录的成本。
然后你应该尝试不同的日志库和它们提供的模式,并记录观察到的差异。
以我个人的经验,对于我参与的所有三个项目,我发现异步日志记录有助于大大提高应用程序的吞吐量。但同样的情况可能不适用于您,因此请确保您在仔细测量后做出决定。
以下内容与您的问题没有直接关系。
我注意到您特别提到了业务日志记录。在这种情况下,您可能还希望保持日志的相关性和清洁性,以防您发现日志文件变得庞大且难以理解。在这方面有一个普遍接受的设计模式:按功能记录。这意味着业务日志(例如,客户要求退款)会转到不同的目的地,界面日志会转到另一个目的地(例如,用户单击了赞成按钮!= 用户赞成回答),并且跨系统调用将去到另一个目的地(例如,通过支付网关请求清关)。有些人还保留一个包含所有事件的主日志文件,只是为了查看过程的时间表,而有些人则设计日志挖掘器/抓取器以在需要时构建时间表。
希望这可以帮助,