logback的isDebugEnabled日志配置級(jí)別源碼解析
序
本文主要研究一下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先通過(guò)callTurboFilters獲取debug級(jí)別的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先通過(guò)callTurboFilters獲取debug級(jí)別的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日志配置級(jí)別源碼解析的詳細(xì)內(nèi)容,更多關(guān)于logback isDebugEnabled的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- logback的LevelFilter日志過(guò)濾器源碼解讀
- logback EvaluatorFilter實(shí)現(xiàn)同時(shí)記錄多個(gè)level級(jí)別的日志
- logback?EvaluatorFilter日志過(guò)濾器源碼解讀
- logback標(biāo)記日志過(guò)濾器MarkerFilter源碼解讀
- logback使用MDCFilter日志過(guò)濾源碼解讀
- logback的DuplicateMessageFilter日志過(guò)濾操作源碼解讀
- Java面試Logback打印日志如何獲取當(dāng)前方法名稱題解
- logback ThresholdFilter臨界值日志過(guò)濾器源碼解讀
相關(guān)文章
基于Java多線程notify與notifyall的區(qū)別分析
本篇文章對(duì)Java中多線程notify與notifyall的區(qū)別進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05
淺談Java工程讀取resources中資源文件路徑的問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談Java工程讀取resources中資源文件路徑的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
struts2中通過(guò)json傳值解決亂碼問(wèn)題的實(shí)現(xiàn)方法
這篇文章主要介紹了struts2中通過(guò)json傳值解決亂碼問(wèn)題的實(shí)現(xiàn)方法,涉及js編碼及java解碼的相關(guān)操作技巧,需要的朋友可以參考下2016-06-06
mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說(shuō)明
這篇文章主要介紹了mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
使用java.nio.file?庫(kù)優(yōu)雅的操作文件詳解
這篇文章主要介紹了使用java.nio.file?庫(kù)優(yōu)雅的操作文件詳解,需要的朋友可以參考下2023-05-05
Java之SpringCloud nocos注冊(cè)中心講解
這篇文章主要介紹了Java之SpringCloud nocos注冊(cè)中心講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

