序
本文主要研究一下logback的isDebugEnabled
isDebugEnabled
代码语言:javascript复制public final class Logger
implements org.slf4j.Logger, LocationAwareLogger, LoggingEventAware, AppenderAttachable<ILoggingEvent>, Serializable {
//......
public boolean isDebugEnabled() {
return isDebugEnabled(null);
}
public boolean isDebugEnabled(Marker marker) {
final FilterReply decision = callTurboFilters(marker, Level.DEBUG);
if (decision == FilterReply.NEUTRAL) {
return effectiveLevelInt <= Level.DEBUG_INT;
} else if (decision == FilterReply.DENY) {
return false;
} else if (decision == FilterReply.ACCEPT) {
return true;
} else {
throw new IllegalStateException("Unknown FilterReply value: " decision);
}
}
}
isDebugEnabled先通过callTurboFilters获取debug级别的FilterReply,若为DENY返回false,若为ACCEPT返回true,若为NEUTRAL则判断effectiveLevelInt是否小于等于DEBUG_INT
callTurboFilters
代码语言:javascript复制 /**
* Method that calls the attached TurboFilter objects based on the logger and
* the level.
*
* It is used by isYYYEnabled() methods.
*
* It returns the typical FilterReply values: ACCEPT, NEUTRAL or DENY.
*
* @param level
* @return the reply given by the TurboFilters
*/
private FilterReply callTurboFilters(Marker marker, Level level) {
return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, null, null, null);
}
callTurboFilters从loggerContext获取getTurboFilterChainDecision_0_3OrMore
getTurboFilterChainDecision_0_3OrMore
ch/qos/logback/classic/LoggerContext.java
代码语言:javascript复制 final FilterReply getTurboFilterChainDecision_0_3OrMore(final Marker marker, final Logger logger, final Level level,
final String format, final Object[] params, final Throwable t) {
if (turboFilterList.size() == 0) {
return FilterReply.NEUTRAL;
}
return turboFilterList.getTurboFilterChainDecision(marker, logger, level, format, params, t);
}
该方法先判断turboFilterList是否为空,为空则返回NEUTRAL,否则执行turboFilterList.getTurboFilterChainDecision
getTurboFilterChainDecision
ch/qos/logback/classic/spi/TurboFilterList.java
代码语言:javascript复制 public FilterReply getTurboFilterChainDecision(final Marker marker, final Logger logger, final Level level,
final String format, final Object[] params, final Throwable t) {
final int size = size();
// if (size == 0) {
// return FilterReply.NEUTRAL;
// }
if (size == 1) {
try {
TurboFilter tf = get(0);
return tf.decide(marker, logger, level, format, params, t);
} catch (IndexOutOfBoundsException iobe) {
return FilterReply.NEUTRAL;
}
}
Object[] tfa = toArray();
final int len = tfa.length;
for (int i = 0; i < len; i ) {
// for (TurboFilter tf : this) {
final TurboFilter tf = (TurboFilter) tfa[i];
final FilterReply r = tf.decide(marker, logger, level, format, params, t);
if (r == FilterReply.DENY || r == FilterReply.ACCEPT) {
return r;
}
}
return FilterReply.NEUTRAL;
}
getTurboFilterChainDecision在只有1个TurboFilter的时候执行decide方法,否则遍历TurboFilter,挨个执行decide,一但有DENY或者ACCEPT直接返回,否则最后返回NEUTRAL
小结
logback的isDebugEnabled先通过callTurboFilters获取debug级别的FilterReply,若为DENY返回false,若为ACCEPT返回true,若为NEUTRAL则判断effectiveLevelInt是否小于等于DEBUG_INT。callTurboFilters是一系列isYYYEnabled()共用的,它在turboFilterList是否为空,为空则返回NEUTRAL,在只有1个TurboFilter的时候执行decide方法,否则遍历TurboFilter,挨个执行decide,一但有DENY或者ACCEPT直接返回,否则最后返回NEUTRAL。