美文网首页
聊聊logback的isDebugEnabled

聊聊logback的isDebugEnabled

作者: go4it | 来源:发表于2023-11-11 13:48 被阅读0次

    本文主要研究一下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

          本文链接:https://www.haomeiwen.com/subject/whnkwdtx.html