一.应用场景
if (logger.isDebugEnabled()) {
logger.debug("获取的数据是 " + getData());
}
应用场景中是先调用isDebugEnabled(),再调用debug()方法,那么为什么要先调用isDebugEnabled()方法,不直接调用debug()方法呢?接下来就看一下两个方法的源代码。
二.分析源码
1.isDebugEnabled()的源码:
public boolean isDebugEnabled() {
if(repository.isDisabled( Level.DEBUG_INT))
return false;
return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}
2.debug()的源码:
public void debug(Object message) {
if(repository.isDisabled(Level.DEBUG_INT))
return;
if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
forcedLog(FQCN, Level.DEBUG, message, null);
}
}
三.分析
1.源码看isDebugEnabled()方法和debug()方法中都是采用了if(repository.isDisabled(Level.DEBUG_INT))判断条件,那么直接采用debug()方法不是应该更高效?
2.此时来看下面的代码: logger.debug("获取的数据是 " + getData());
假设我们的日志级别设置为info,那么logger.debug("获取的数据是 " + getData())就不会输出,但是直接调用
debug()方法后会执行getData()方法,
假设这个调用的过程需要10秒钟,则系统会在花费10秒后,再判断if(repository.isDisabled(Level.DEBUG_INT))
,然后return ,这显然什么都没有做就直接返回但是还花费了时间调用getData()方法,如果并发数大的话,这样写还是会影响系统的性能的。所以这个时候,就应该写成如下,以避免在不符合要求的log级别下一些不必要方法的调用:
if(logger.isDebugEnabled()){
logger.debug("The money is " + getData());
}
如果debug的参数很简单的话,也可以直接写如下:
logger.debug(message)
3.官方的说法,执行一次logger.isDebugEnabled()这样的判断花费的时间大概是写日志时间的万分之一.虽然这个比例很小, 但是,程序中的任何地方放到并发的环境下,我们就得重新考虑了。