参考1:isDebugEnabled作用 参考2:Java日志框架中真的需要判断log.isDebugEnabled()吗?
在项目中经常会看到这样的代码:
代码语言:javascript复制if (logger.isDebugEnabled()) {
logger.debug(message);
}
为什么要这样做呢?
且看isDebugEnabled()
的源码:
public boolean isDebugEnabled() {
if(repository.isDisabled( Level.DEBUG_INT)) // Level范围值作为参数,返回true
return false;
return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}
实际调用的是NOPLoggerRepository.isDisabled()
:
public boolean isDisabled(final int level) {
return true;
}
再看debug()
的源码:
public void debug(String msg) {
this.logger.log(FQCN, Level.DEBUG, msg, (Throwable)null);
}
继续往下追踪log()
的源码:
public void log(String callerFQCN, Priority level, Object message, Throwable t) {
if(repository.isDisabled(level.level)) {
return;
}
if(level.isGreaterOrEqual(this.getEffectiveLevel())) {
forcedLog(callerFQCN, level, message, t);
}
}
实际调用的也是NOPLoggerRepository.isDisabled()
:
public boolean isDisabled(final int level) {
return true;
}
可见,debug()
中做了跟isDebugEnabled()
几乎一样的判断,看起来直接调用debug()
比先判断isDebugEnabled()
更加效率。
此时来看下面的代码:
代码语言:javascript复制log.debug("message:" user.getMessage());
假如我们的日志级别为info
,那么这句话不会被输出,但是这样写,这个方法还是会调用,因此getMessage()
方法还是会执行。如果getMessage()
这个方法过于复杂,需要很长时间来执行。而参数构造完之后,我们进入debug()
方法进行判断
if(repository.isDisabled(level.level)) {
return;
}
在这里就返回了。这样会导致我们什么都没有做但却耗费了时间,如果并发量大的时候,对性能的影响就比较明显了。假设这个获取参数的过程需要10秒钟,则系统会在花费10秒后决定return,这显然很得不偿失。
这个时候,出于性能的考虑,我们就应当添加isDebugEnabled()
判断
if (logger.isDebugEnabled()) {
logger.debug("message:" user.getMessage());
}
但是如果是这样简单的输出:
代码语言:javascript复制logger.debug("error");
添加判断就没有必要了。