Log4j中isDebugEnabled作用

2020-08-03 23:22:19 浏览数 (1)

参考1:isDebugEnabled作用 参考2:Java日志框架中真的需要判断log.isDebugEnabled()吗?

在项目中经常会看到这样的代码:

代码语言:javascript复制
if (logger.isDebugEnabled()) {
    logger.debug(message);
}

为什么要这样做呢?

且看isDebugEnabled()的源码:

代码语言:javascript复制
public boolean isDebugEnabled() {
  if(repository.isDisabled( Level.DEBUG_INT))  // Level范围值作为参数,返回true
    return false;
  return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
}

实际调用的是NOPLoggerRepository.isDisabled()

代码语言:javascript复制
public boolean isDisabled(final int level) {
    return true;
}

再看debug()的源码:

代码语言:javascript复制
public void debug(String msg) {
    this.logger.log(FQCN, Level.DEBUG, msg, (Throwable)null);
}

继续往下追踪log()的源码:

代码语言:javascript复制
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()

代码语言:javascript复制
public boolean isDisabled(final int level) {
    return true;
}

可见,debug()中做了跟isDebugEnabled()几乎一样的判断,看起来直接调用debug()比先判断isDebugEnabled()更加效率。


此时来看下面的代码:

代码语言:javascript复制
log.debug("message:"   user.getMessage());

假如我们的日志级别为info,那么这句话不会被输出,但是这样写,这个方法还是会调用,因此getMessage()方法还是会执行。如果getMessage()这个方法过于复杂,需要很长时间来执行。而参数构造完之后,我们进入debug()方法进行判断

代码语言:javascript复制
if(repository.isDisabled(level.level)) {
    return;
}

在这里就返回了。这样会导致我们什么都没有做但却耗费了时间,如果并发量大的时候,对性能的影响就比较明显了。假设这个获取参数的过程需要10秒钟,则系统会在花费10秒后决定return,这显然很得不偿失。

这个时候,出于性能的考虑,我们就应当添加isDebugEnabled()判断

代码语言:javascript复制
if (logger.isDebugEnabled()) {
   logger.debug("message:"   user.getMessage());
}

但是如果是这样简单的输出:

代码语言:javascript复制
logger.debug("error");

添加判断就没有必要了。

0 人点赞