日志记录对Apache性能的影响

时间:2010-06-22 07:03:53

标签: performance apache logging module

我正在开发一个Apache模块。在开发过程中,我发现在代码中的各个点使用日志记录功能很方便。 例如,在打开文件后,如果操作不成功,我会记录错误,以便我可以准确地知道代码中出现问题的位置。

现在,我即将把我的模块发给我的老板(我正在实习)。我想了解有关日志记录的最佳做法。它是否有利于维护或是否有害,因为它可能会妨碍服务器的响应时间。

2 个答案:

答案 0 :(得分:1)

这实际上取决于您编写这些日志记录指令的方式。如果你写了:

logger.debug(computeSomeCostlyDebugOutput());

如果未在DEBUG级别设置记录器,则可能会严重影响性能(computeSomeCostlyDebugOutput总是需要时间来执行,如果与DEBUG级别不匹配,则记录器将忽略其结果。)

如果你这样写它:

if (logger.isDebugEnabled()) {
  logger.debug(computeSomeCostlyDebugOutput());
}

然后,只有设置了正确的记录器级别(即记录器不会忽略它),才会发生代价高昂的操作和记录。它基本上像记录器的另一个开关,第一个开关是配置的记录器级别。

正如Andrzej Doyle所指出的那样,记录器会在内部检查其级别,但这会在debug方法中发生,此时已经浪费在computeSomeCostlyDebugOutput上。如果你在computeSomeCostlyDebugOutput中浪费时间,当你知道它的结果不会白费时你最好这样做。

许多软件附带了日志记录指令,如果您需要有关事物,执行路径和内容的内部工作的更多详细信息,您可以激活它们。只需确保它们可以被停用,并且只有在设置了适当的级别时才需要计算时间。

答案 1 :(得分:0)

Log4J的设计目标之一(有充分理由)是性能; Ceki Gulku希望这个库可以用于生产,企业软件和Log4J本身的开销实际上非常小(用我自己的webapp项目和一个分析器测量)。

可能需要一些时间的两件事是:

  1. 为某些调用形成传递的参数到日志记录方法中。正如dpb所说,应该通过在日志记录检查中包含任何复杂输出的计算来避免这种情况,这样当记录器将其丢弃时,你不会导出复杂的调试输出,因为它只设置为记录错误。
  2. 记录日志数据所需的绝对I / O.如果你的应用程序每秒记录200Mb的调试日志(这可能听起来不可行,但之前发生在我身上)那么这可能会对它的运行速度造成压力,因为IIRC文件写入同步发生。在我开发的各种webapp类型的项目中,当我将日志设置为调试级别时,我通常会注意到响应性略有不同(和IMO这是一件好事,因为应该生成当你要求调试日志时输出很多。)