欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

logback的isDebugEnabled日志配置級別源碼解析

 更新時(shí)間:2023年11月12日 14:33:59   作者:codecraft  
這篇文章主要為大家介紹了logback的isDebugEnabled日志配置級別源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下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,否則執(zhí)行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個(gè)TurboFilter的時(shí)候執(zhí)行decide方法,否則遍歷TurboFilter,挨個(gè)執(zhí)行decide,一但有DENY或者ACCEPT直接返回,否則最后返回NEUTRAL

小結(jié)

logback的isDebugEnabled先通過callTurboFilters獲取debug級別的FilterReply,若為DENY返回false,若為ACCEPT返回true,若為NEUTRAL則判斷effectiveLevelInt是否小于等于DEBUG_INT。callTurboFilters是一系列isYYYEnabled()共用的,它在turboFilterList是否為空,為空則返回NEUTRAL,在只有1個(gè)TurboFilter的時(shí)候執(zhí)行decide方法,否則遍歷TurboFilter,挨個(gè)執(zhí)行decide,一但有DENY或者ACCEPT直接返回,否則最后返回NEUTRAL。

以上就是logback的isDebugEnabled日志配置級別源碼解析的詳細(xì)內(nèi)容,更多關(guān)于logback isDebugEnabled的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Java多線程notify與notifyall的區(qū)別分析

    基于Java多線程notify與notifyall的區(qū)別分析

    本篇文章對Java中多線程notify與notifyall的區(qū)別進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • Java實(shí)現(xiàn)分頁代碼

    Java實(shí)現(xiàn)分頁代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)分頁代碼,提高查詢效率,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 淺談Java工程讀取resources中資源文件路徑的問題

    淺談Java工程讀取resources中資源文件路徑的問題

    下面小編就為大家?guī)硪黄獪\談Java工程讀取resources中資源文件路徑的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • struts2中通過json傳值解決亂碼問題的實(shí)現(xiàn)方法

    struts2中通過json傳值解決亂碼問題的實(shí)現(xiàn)方法

    這篇文章主要介紹了struts2中通過json傳值解決亂碼問題的實(shí)現(xiàn)方法,涉及js編碼及java解碼的相關(guān)操作技巧,需要的朋友可以參考下
    2016-06-06
  • 詳細(xì)分析JAVA 線程池

    詳細(xì)分析JAVA 線程池

    這篇文章主要介紹了JAVA 線程池的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • mybatis一級緩存和二級緩存的區(qū)別及說明

    mybatis一級緩存和二級緩存的區(qū)別及說明

    這篇文章主要介紹了mybatis一級緩存和二級緩存的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring中@Transactional注解的使用詳解

    Spring中@Transactional注解的使用詳解

    @Transactional注解是Spring提供的一種聲明式事務(wù)管理方式,這篇文章主要為大家詳細(xì)介紹了@Transactional注解的原理分析及使用,需要的可以參考一下
    2023-05-05
  • Java?MyBatis本地緩存原理詳解

    Java?MyBatis本地緩存原理詳解

    這篇文章主要介紹了Java?MyBatis本地緩存原理詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 使用java.nio.file?庫優(yōu)雅的操作文件詳解

    使用java.nio.file?庫優(yōu)雅的操作文件詳解

    這篇文章主要介紹了使用java.nio.file?庫優(yōu)雅的操作文件詳解,需要的朋友可以參考下
    2023-05-05
  • Java之SpringCloud nocos注冊中心講解

    Java之SpringCloud nocos注冊中心講解

    這篇文章主要介紹了Java之SpringCloud nocos注冊中心講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論