繁体   English   中英

log.debug是否会降低性能

[英]Does log.debug decrease performance

我想在调试日志中写一些日志,这些日志在具有信息日志级别的生产日志中不可用。 那么这些额外的调试日志将如何影响性能呢? 我的意思是如果我们将日志级别设置为INFO,则记录器必须检查日志级别是什么,并发现需要忽略log.debug。

那么额外的日志级别检查会影响性能吗?

在部署时是否有任何自动删除log.debug()语句的方法? 我的意思是在开发期间log.debug将在那里,我们可以调试。 但在生产部署期间,自动机制将删除所有log.debug()消息。 我不确定这些是否可行。

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

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

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

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

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

我建议使用slf4j,以便通过使用{} (使用它的MessageFormatter替换实际值)来避免第二个记录器计算开销,如下所示:

//Below logger product and dept toString() NOT invoked
logger.debug(" Entry : product:{} dept{}", product, dept);

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

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

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

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

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

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

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

要检查的另一件事是你正在缓冲输出(再次,在slf4j中,有缓冲的appender),这将最小化写入。

您可以在调用isDebugEnabled()包装“debug”语句

if (log.isDebugEnabled()) {
    log.debug("my debug statement");
}

同样,在对isInfoEnabled()等的调用中包装“info”语句。

这样做的想法是检查是否启用了日志记录级别是一种廉价(固定成本)操作。 生成正在记录的语句的成本将根据您的操作而有所不同。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM