log.debug是否会降低性能

时间:2017-04-07 18:03:49

标签: java log4j

我想在调试日志中写一些日志,这些日志在具有信息日志级别的生产日志中不可用。那么这些额外的调试日志将如何影响性能呢?我的意思是如果我们将日志级别设置为INFO,则记录器必须检查日志级别是什么,并发现需要忽略log.debug。那么额外的日志级别检查会影响性能吗?在部署时是否有任何自动删除log.debug()语句的方法?我的意思是在开发期间log.debug将在那里,我们可以调试。但在生产部署期间,自动机制将删除所有log.debug()消息。我不确定这些是否可行。如果不是那么好 - C'est la vie!

5 个答案:

答案 0 :(得分:3)

  

那么这些额外的调试日志将如何影响性能呢?

它会影响应用程序的性能,因为记录器是磁盘I / O调用(假设您正在写入文件系统),并且严格不建议 DEBUG日志级别用于生产环境

  

是否有任何自动删除log.debug()语句的方法   部署时?

不,没有神奇的方法可以删除log.debug()语句,但是当您将日志记录级别设置为INFO时,只要您在将参数传递给{{1}时没有进行繁重的计算方法,应该没问题。例如,如果您将记录器级别设置为INFO并假设您的代码中有以下两个记录器

debug()

我建议使用slf4j,以便您可以使用logger.debug(" Entry:: "); //this logger is fine, no calculations //Below logger, you are doing computations to print i.e., calling to String methods logger.debug(" Entry : product:"+product+" dept:"+dept);//overhead toString() calls (使用MessageFormatter取代实际值)来避免第二次记录器计算开销如下图所示:

{}

另一个重要的一点是, slf4j只是一个抽象,您可以在任何日志记录框架之间切换,您可以查看从here获取的文本。

  

Java简单日志外观(SLF4J)是一个简单的外观   或各种日志框架的抽象(例如java.util.logging,   logback,log4j)允许最终用户插入所需的日志记录   部署时的框架。

答案 1 :(得分:3)

您可以通过编写日志记录语句来最小化这一点。如果你写

Object a = .... 
log.debug("I have an a: " + a);

然后,无论日志框架如何,在调试函数运行之前,您必须对使用该参数进行评估。这意味着,即使您处于INFO级别,您也需要支付在toString上调用a并构建参数字符串的性能成本。如果你反而写(取决于日志框架使用的格式,这适用于log4j和slf4j)

log.debug("I have an a: {}", a);

您不需要支付此费用,只需支付记录器检查您是否处于调试模式的费用 - 除非您需要,否则您无需为参数评估付费。

要检查的另一件事是你要缓冲输出(再次,在slf4j中,有缓冲的appender),这将最大限度地减少写入。

答案 2 :(得分:2)

您可以在调用//Below logger product and dept toString() NOT invoked logger.debug(" Entry : product:{} dept{}", product, dept);

时包装“debug”语句
isDebugEnabled()

同样,在调用if (log.isDebugEnabled()) { log.debug("my debug statement"); }

时打包“info”语句

这样做的想法是检查是否启用了日志记录级别是一种廉价(固定成本)操作。生成正在记录的语句的成本将取决于您正在执行的操作。

答案 3 :(得分:2)

我想在Android开发中经常使用的另一种技术是,您可以对jar进行后处理,以删除调试等调用。使用的工具通常是proguard。如果您将调用定义为无副作用,则可以通过优化器将其删除,确保几乎没有性能损失......它甚至应该足够智能,以优化您为日志消息所做的任何字符串构造。

https://www.guardsquare.com/en/proguard/manual/usage#assumenosideeffects

答案 4 :(得分:1)

检查日志记录级别的开销非常小,几乎可以忽略不计。启用调试日志时,您将看到对性能的重大影响。影响将取决于您写入日志,存储的数据量(如果您的存储是SSD,性能命中与使用普通磁盘的性能相比较小),有多少线程写入日志(自只有一个线程可以立即写入文件所有其他线程必须等待,这是一个顺序过程)。我已经提到了三个,但有更多的因素决定了日志记录对应用程序性能的影响程度。

要回答第二个问题,没有自动方法从代码中删除调试语句。