logback的isDebugEnabled日志配置级别源码解析
作者:codecraft
这篇文章主要为大家介绍了logback的isDebugEnabled日志配置级别源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
序
本文主要研究一下logback的isDebugEnabled
isDebugEnabled
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
/** * 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
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
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。
以上就是logback的isDebugEnabled日志配置级别源码解析的详细内容,更多关于logback isDebugEnabled的资料请关注脚本之家其它相关文章!