log.debug 是否会降低性能

2022-09-04 01:30:25

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

那么,这种额外的日志级别检查是否会影响性能呢?

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


答案 1

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

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

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

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

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只是一个抽象,你可以在任何日志记录框架之间切换,你可以看看下面从这里获取的文本。

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


答案 2

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

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

同样,将您的“信息”语句包装在对 etc 的调用中。isInfoEnabled()

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


推荐