logback?EvaluatorFilter日志過濾器源碼解讀
序
本文主要研究一下logback的EvaluatorFilter
EvaluatorFilter
ch/qos/logback/core/filter/EvaluatorFilter.java
public class EvaluatorFilter<E> extends AbstractMatcherFilter<E> { EventEvaluator<E> evaluator; @Override public void start() { if (evaluator != null) { super.start(); } else { addError("No evaluator set for filter " + this.getName()); } } public EventEvaluator<E> getEvaluator() { return evaluator; } public void setEvaluator(EventEvaluator<E> evaluator) { this.evaluator = evaluator; } public FilterReply decide(E event) { // let us not throw an exception // see also bug #17. if (!isStarted() || !evaluator.isStarted()) { return FilterReply.NEUTRAL; } try { if (evaluator.evaluate(event)) { return onMatch; } else { return onMismatch; } } catch (EvaluationException e) { addError("Evaluator " + evaluator.getName() + " threw an exception", e); return FilterReply.NEUTRAL; } } }
EvaluatorFilter繼承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)為true時返回onMatch,否則返回onMismatch,異常的話返回NEUTRAL
EventEvaluator
ch/qos/logback/core/boolex/EventEvaluator.java
public interface EventEvaluator<E> extends ContextAware, LifeCycle { /** * Evaluates whether the event passed as parameter matches some user-specified * criteria. * * <p> * The <code>Evaluator</code> is free to evaluate the event as it pleases. In * particular, the evaluation results <em>may</em> depend on previous events. * * @param event The event to evaluate * @return true if there is a match, false otherwise. * @throws NullPointerException can be thrown in presence of null values * @throws EvaluationException may be thrown during faulty evaluation */ boolean evaluate(E event) throws NullPointerException, EvaluationException; /** * Evaluators are named entities. * * @return The name of this evaluator. */ String getName(); /** * Evaluators are named entities. */ void setName(String name); }
EventEvaluator接口定義了evaluate、getName、setName方法
EventEvaluatorBase
ch/qos/logback/core/boolex/EventEvaluatorBase.java
abstract public class EventEvaluatorBase<E> extends ContextAwareBase implements EventEvaluator<E> { String name; boolean started; public String getName() { return name; } public void setName(String name) { if (this.name != null) { throw new IllegalStateException("name has been already set"); } this.name = name; } public boolean isStarted() { return started; } public void start() { started = true; } public void stop() { started = false; } }
EventEvaluatorBase聲明實(shí)現(xiàn)EventEvaluator,它主要是定義了name、started屬性,另外還有一個抽象子類為EventEvaluatorBase,而JaninoEventEvaluatorBase抽象子類繼承了EventEvaluatorBase,它們有基于IAccessEvent,也有基于ILoggingEvent。
OnMarkerEvaluator
ch/qos/logback/classic/boolex/OnMarkerEvaluator.java
public class OnMarkerEvaluator extends EventEvaluatorBase<ILoggingEvent> { List<String> markerList = new ArrayList<String>(); public void addMarker(String markerStr) { markerList.add(markerStr); } /** * Return true if event passed as parameter contains one of the specified * user-markers. */ public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException { List<Marker> markerListInEvent = event.getMarkerList(); if (markerListInEvent == null || markerListInEvent.isEmpty()) { return false; } for (String markerStr : markerList) { for (Marker markerInEvent : markerListInEvent) { if (markerInEvent.contains(markerStr)) { return true; } } } return false; } }
OnMarkerEvaluator繼承了EventEvaluatorBase,其evaluate從ILoggingEvent獲取markerListInEvent,然后判斷markerListInEvent是否有包含指定的markerStr
OnErrorEvaluator
ch/qos/logback/classic/boolex/OnErrorEvaluator.java
public class OnErrorEvaluator extends EventEvaluatorBase<ILoggingEvent> { /** * Return true if event passed as parameter has level ERROR or higher, returns * false otherwise. */ public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException { return event.getLevel().levelInt >= Level.ERROR_INT; } }
OnErrorEvaluator繼承了EventEvaluatorBase,其evaluate方法根據(jù)event的level來判斷看是否大于等于ERROR級別
JaninoEventEvaluatorBase
ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java
abstract public class JaninoEventEvaluatorBase<E> extends EventEvaluatorBase<E> { static Class<?> EXPRESSION_TYPE = boolean.class; static Class<?>[] THROWN_EXCEPTIONS = new Class[1]; static public final int ERROR_THRESHOLD = 4; static { THROWN_EXCEPTIONS[0] = EvaluationException.class; } private String expression; ScriptEvaluator scriptEvaluator; private int errorCount = 0; public void start() { try { assert context != null; scriptEvaluator = new ScriptEvaluator(getDecoratedExpression(), EXPRESSION_TYPE, getParameterNames(), getParameterTypes(), THROWN_EXCEPTIONS); super.start(); } catch (Exception e) { addError("Could not start evaluator with expression [" + expression + "]", e); } } public boolean evaluate(E event) throws EvaluationException { if (!isStarted()) { throw new IllegalStateException("Evaluator [" + name + "] was called in stopped state"); } try { Boolean result = (Boolean) scriptEvaluator.evaluate(getParameterValues(event)); return result; } catch (Exception ex) { errorCount++; if (errorCount >= ERROR_THRESHOLD) { stop(); } throw new EvaluationException("Evaluator [" + name + "] caused an exception", ex); } } //...... }
JaninoEventEvaluatorBase在start的時候先通過getDecoratedExpression獲取修飾之后的表達(dá)式,然后創(chuàng)建ScriptEvaluator,evaluate方法則通過getParameterValues從event提取參數(shù),然后通過scriptEvaluator.evaluate獲取結(jié)果
示例
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> <marker>consoleOnly</marker> </evaluator> <onMatch>DENY</onMatch> </filter>
這里配置了EvaluatorFilter,其evaluator為OnMarkerEvaluator,包含consoleOnly這個marker時返回true,命中返回DENY
小結(jié)
logback的EvaluatorFilter繼承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)為true時返回onMatch,否則返回onMismatch,異常的話返回NEUTRAL。evaluator主要有OnMarkerEvaluator、OnErrorEvaluator以及JaninoEventEvaluatorBase系列的evaluator;JaninoEventEvaluatorBase它可以定義expression,通過ScriptEvaluator進(jìn)行evaluate。
以上就是logback EvaluatorFilter日志過濾器源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于logback EvaluatorFilter日志過濾器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java跨session實(shí)現(xiàn)token接口測試過程圖解
這篇文章主要介紹了Java跨session實(shí)現(xiàn)token接口測試過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04java實(shí)現(xiàn)發(fā)送手機(jī)短信
這篇文章主要介紹了java實(shí)現(xiàn)發(fā)送手機(jī)短信,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03Mybatis-plus對單表操作的封裝實(shí)現(xiàn)
本文詳細(xì)介紹了MyBatis-Plus單表操作,包括自定義SQL、邏輯刪除、樂觀鎖、全局?jǐn)r截器和代碼生成器等,具有一定的參考價值,感興趣的可以了解一下2024-12-12spring?boot集成jasypt?并實(shí)現(xiàn)自定義加解密的詳細(xì)步驟
由于項(xiàng)目中的配置文件?配置的地方過多,現(xiàn)將配置文件統(tǒng)一放到nacos上集中管理?且密碼使用加密的方式放在配置文件中,配置文件的加密使用加密庫jasypt,本文給大家介紹spring boot集成jasypt并實(shí)現(xiàn)自定義加解密,感興趣的朋友一起看看吧2023-08-08@ConfigurationProperties綁定配置信息至Array、List、Map、Bean的實(shí)現(xiàn)
這篇文章主要介紹了@ConfigurationProperties綁定配置信息至Array、List、Map、Bean的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05SpringBoot數(shù)據(jù)庫初始化datasource配置方式
這篇文章主要為大家介紹了SpringBoot數(shù)據(jù)庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12