首页 > 代码库 > logger.isDebugEnabled()作用

logger.isDebugEnabled()作用

项目中经常会用到:
if (logger.isDebugEnabled()) {
    logger.debug( "message:" + user.getMessage() );
}
我们会想当然得认为这段代码作用是为了控制日志文件的输出,但是通过查看源码我们会发现,在debug()方法中做了与isDebugEnabled()方法一样的判断,因此我们在需要输出日志的地方直接调用debug方法也可以达到控制输出的目的。
以下是isDebugEnabled()以及debug()方法的源码:

public boolean isDebugEnabled() {    

  if(repository.isDisabled( Level.DEBUG_INT))

    return false;

  return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());

}

public void debug(Object message) {

  if(repository.isDisabled(Level.DEBUG_INT))

    return;

  if(Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {

    forcedLog(FQCN, Level.DEBUG, message, null);

  }

}

那么我们为什么还要多此一举,加上这样一个判断语句呢?

官方的说法是:出于效率考虑,看具体情况而定。

首先我们看以下代码:

log.debug( "message:" + user.getMessage() );
假如我们的日志级别为info,那么这句话不会被输出,但是这样写,这个方法还是会调用,因此getMessage()方法还是会执行。如果getMessage()这个方法过于复杂,需要很长时间来执行。而参数构造完之后,我们进入debug()方法进行判断:
    if(repository.isDisabled(Level.DEBUG_INT))
        return;
在这里就返回了。这样会导致我们什么都没有做但却耗费了时间,如果并发量大的时候,对性能的影响就比较明显了。
    这个时候,出于性能的考虑,我们就应当添加isDebugEnabled()判断
    if (logger.isDebugEnabled()) {

        logger.debug( "message:" + user.getMessage() );

    }
但是如果是这样简单的输出:
    logger.debug(“error”);
添加判断就没有必要了。

logger.isDebugEnabled()作用