一、问题由来
在代码中,我们经常会看到打印debug日志的时候,会判断下当前的日志级别:
到底有没有必要呢?
二、答案
1、如果打印的实参不含计算的,【完全没有必要】
2、如果打印的实参含有计算的,【完全有必要】
三、实验探究
1、Log4j 源码
debug()方法中,一开始就做了和isDebugEnabled()一样的事情,那是不是就不需要判断了?
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);
}
}
2、Java编译器的实参执行顺序:实参从左到右,最后是执行方法
这问题其实和log4j的关系不大,真正的原因是实参的执行顺序以及计算
结论:打印debug日志,如果需要打印的数据需要计算实参的,必须加判断。这是因为不管debug()里面具体执不执行,实参的方法调用确实是执行了。
不好的例子:
log.debug("a" + "b");
log.debug("" + JSON.toJSONString(demo));
log.debug("{}", JSON.toJSONString(demo));
好的例子:
log.debug("{} {}","a","b");
log.debug("{}", demo);
4、结论
如果debug()里面的含有实参计算的,必须加判断。
一般debug中都是需要打印出实体类json数据,所以建议大家还是加上isDebugEnabled判断。