先看下面的代碼,在真正執(zhí)行logger.debug()
之前后裸,進(jìn)行了logger.isDebugEnabled()
的判斷,既然log4j.properties已經(jīng)配置了log level為debug, 為什么還需要這個判斷做裙?
if (logger.isDebugEnabled()) {
logger.debug("Entry number: " + i + " is " + entry[i].toString());
}
加上這個logger.isDebugEnabled()
后习瑰,如果值為false,if里面的代碼就不會執(zhí)行抡笼,就節(jié)省了字符串的拼接苏揣,少生成幾個對象,如果不加推姻,總會先拼接里面的字符串(連接字符串最好也不用+)
如果不用logger.isDebugEnabled()
, 請使用log4j的其他重載的方法, 比如下面的
ogger.debug("Entry number: {} is {}", i, entry[i]);
這個代碼實際上會先判斷debug是否是enabled, 只有enabled才會format里面的字符串平匈,下面就是log4j的源碼:
@Override
public void debug(final String message, final Supplier<?>... paramSuppliers) {
logIfEnabled(FQCN, Level.DEBUG, null, message, paramSuppliers);
}
@Override
public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Message msg,
final Throwable t) {
if (isEnabled(level, marker, msg, t)) {
logMessageSafely(fqcn, level, marker, msg, t);
}
}
@Override
public boolean isEnabled(final Level level, final Marker marker, final String message, final Throwable t) {
return privateConfig.filter(level, marker, message, t);
}
一句話總結(jié)一下:logger.isDebugEnabled()
為了提高某些情況下的性能才設(shè)計的。
參考: