【log4j】logger.isTraceEnabled()

我们经常可以看到,在使用日志框架时,会有如下写法:

1
2
3
if (logger.isTraceEnabled()) {
logger.trace("trace");
}

为什么要这样写呢?这样写有什么好处?
首先我们来看下这两个方法的源码:

1
2
3
public boolean isTraceEnabled() {
return super.repository.isDisabled(5000) ? false : Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel());
}
1
2
3
4
5
6
7
8
public void trace(Object message) {
if (!super.repository.isDisabled(5000)) {
if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) {
this.forcedLog(FQCN, Level.TRACE, message, (Throwable)null);
}

}
}

我们可以看到,在使用trace方法打印日志时,会有与isTraceEnabled方法中一样的方法调用,也就是说等同于在trace中调用了isTraceEnabled方法。
那么为什么我们在使用时还要在外层进行一次判断呢?
官方的说法是:出于效率考虑,看具体情况而定。
我们就以下两种情况进行分析:

  1. 直接传入参数,无其他处理
    1
    logger.trace("trace");
    对于这种情况,则完全没有必要在外层进行筛选判断。
  2. 传参数时引入了其他方法
    1
    logger.debug("The money is " + getTotal());  
    对于这种情况,则需要考虑考虑了。如果getTotal()方法是一个较为复杂的、计算量庞大的方法,则在外层进行一下判断就是很有必要的了。无论当前系统的日志级别为哪一等级,程序程序都会调用debug方法,会执行getTotal方法,只不过最后的结果可能是不打印日志而已(日志级别为info或更高)。debug中调用这个方法会消耗较大资源,得不偿失。