小编典典

在 log4j 中,在记录之前检查 isDebugEnabled 是否会提高性能?

all

我在我的应用程序中使用 Log4J 进行日志记录。以前我使用调试调用,如:

选项1:

logger.debug("some debug text");

但一些链接建议最好先检查isDebugEnabled(),例如:

选项 2:

boolean debugEnabled = logger.isDebugEnabled();
if (debugEnabled) {
    logger.debug("some debug text");
}

所以我的问题是“ 选项 2 会以任何方式提高性能吗? ”。

因为在任何情况下,Log4J 框架都对 debugEnabled 进行了相同的检查。对于选项
2,如果我们在单个方法或类中使用多个调试语句可能是有益的,其中框架不需要isDebugEnabled()多次调用方法(每次调用);在这种情况下,它只调用isDebugEnabled()一次方法,如果
Log4J 配置为调试级别,那么实际上它调用isDebugEnabled()了两次方法:

  1. 如果为 debugEnabled 变量赋值,并且
  2. 实际上由 logger.debug() 方法调用。

我不认为,如果我们logger.debug()在方法或类中编写多个语句并debug()根据选项 1 调用方法,那么与选项 2 相比,Log4J
框架会产生开销。由于isDebugEnabled()是一个非常小的方法(就代码而言),它可能是内联的好人选。


阅读 130

收藏
2022-06-06

共1个答案

小编典典

在这种特殊情况下,选项 1 更好。

当涉及调用各种对象的方法并连接结果时,保护语句(检查isDebugEnabled())可以防止对日志消息进行潜在的昂贵计算。toString()

在给定的示例中,日志消息是一个常量字符串,因此让记录器丢弃它与检查记录器是否启用一样有效,并且由于分支较少,它降低了代码的复杂性。

更好的是使用更新的日志框架,其中日志语句采用格式规范和由记录器替换的参数列表——“懒惰地”,只有在启用记录器的情况下。这是slf4j采用的方法。

2022-06-06