在使用logger.debug()之前是否需要Log4j isDebugEnabled()?

pra*_*nth 26 java log4j

当我浏览一些代码时,我注意到使用logger如下,

if(logger.isDebugEnabled())   
    logger.debug("Something..");
Run Code Online (Sandbox Code Playgroud)

但在某些代码中,我观察到了这样的情况.

logger.debug("Something..");
Run Code Online (Sandbox Code Playgroud)

当我查看log4j的源代码时,在debug()Logger本身的方法中 if(logger.isDebugEnabled())进行了检查.那为什么我们需要这种不必要的开销if(logger.isDebugEnabled())

Gui*_*ume 42

当您传递的String logger.debug(...)花费时间进行评估时,它很有用,在这种情况下,如果未启用调试,则可以跳过此评估.

if(logger.isDebugEnabled()) {
    logger.debug("The meaning of life is " + calculateMeaningOfLife());
}
Run Code Online (Sandbox Code Playgroud)

IMO这使得代码的可读性低得多,因此只有在性能显着提高时才能使用.


Evg*_*eev 12

isDebugEnabled通常用于避免不必要的字符串连接,例如此调用

logger.debug("Line number = " + n);
Run Code Online (Sandbox Code Playgroud)

首先调用Strings concatination然后调试debug()然后只有Logger检测到调试没有启用并且只是返回.这可能会显着影响应用性能.

在SLF4J中解决了这个问题,SLF4J已经格式化了这样的日志记录方法

public void debug(String format, Object arg);
Run Code Online (Sandbox Code Playgroud)


小智 5

Java 必须首先解析传递给调试方法的字符串参数,然后才能调用它。

logger.debug("Something.. var1=" + variable1 + "  var2=" + variable2);
Run Code Online (Sandbox Code Playgroud)

上面的代码将导致创建多个 String 对象,因为每个 + 创建另一个 String,因此在调用该方法之前您将创建大约 5 个或更多对象。

大多数情况下不会启用调试,因此检查是否启用调试比始终解析参数更有效。