最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

logback?EvaluatorFilter日志過(guò)濾器源碼解讀

 更新時(shí)間:2023年11月17日 11:20:26   作者:codecraft  
這篇文章主要為大家介紹了logback?EvaluatorFilter日志過(guò)濾器源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下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時(shí)返回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屬性,另外還有一個(gè)抽象子類為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來(lái)判斷看是否大于等于ERROR級(jí)別

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的時(shí)候先通過(guò)getDecoratedExpression獲取修飾之后的表達(dá)式,然后創(chuàng)建ScriptEvaluator,evaluate方法則通過(guò)getParameterValues從event提取參數(shù),然后通過(guò)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這個(gè)marker時(shí)返回true,命中返回DENY

小結(jié)

logback的EvaluatorFilter繼承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)為true時(shí)返回onMatch,否則返回onMismatch,異常的話返回NEUTRAL。evaluator主要有OnMarkerEvaluator、OnErrorEvaluator以及JaninoEventEvaluatorBase系列的evaluator;JaninoEventEvaluatorBase它可以定義expression,通過(guò)ScriptEvaluator進(jìn)行evaluate。

以上就是logback EvaluatorFilter日志過(guò)濾器源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于logback EvaluatorFilter日志過(guò)濾器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Java制作一個(gè)燈謎猜猜樂(lè)游戲

    基于Java制作一個(gè)燈謎猜猜樂(lè)游戲

    中秋佳節(jié),是我國(guó)傳統(tǒng)的重大節(jié)日之一,全國(guó)各地為了增強(qiáng)過(guò)節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動(dòng),比如猜燈謎,所以本文就來(lái)用Java制作一個(gè)燈謎猜猜樂(lè)游戲,感興趣的可以了解下
    2023-09-09
  • Spring @value和@PropertySource注解使用方法解析

    Spring @value和@PropertySource注解使用方法解析

    這篇文章主要介紹了Spring @value和@PropertySource注解使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot整合activemq的案例代碼

    SpringBoot整合activemq的案例代碼

    ActiveMQ是消息隊(duì)列技術(shù),為解決高并發(fā)問(wèn)題而生,本文通過(guò)案例代碼給大家介紹pringBoot整合activemq的詳細(xì)過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼

    Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-05-05
  • java集合中HashSet LinkedHashSet TreeSet三者異同面試精講

    java集合中HashSet LinkedHashSet TreeSet三者異同面試精講

    這篇文章主要為大家介紹了java集合中HashSet LinkedHashSet TreeSet三者異同面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn)

    gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn)

    這篇文章主要介紹了gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì)

    在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì)

    這篇文章主要介紹了在Spring環(huán)境中正確關(guān)閉線程池的姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java內(nèi)存模型原子性原理及實(shí)例解析

    Java內(nèi)存模型原子性原理及實(shí)例解析

    這篇文章主要介紹了Java內(nèi)存模型原子性原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 在 Spring Boot 中使用 @Autowired和 @Bean注解的示例詳解

    在 Spring Boot 中使用 @Autowired和 @Bean

    本文通過(guò)一個(gè)示例演示了如何在SpringBoot中使用@Autowired和@Bean注解進(jìn)行依賴注入和Bean管理,示例中定義了一個(gè)Student類,并通過(guò)配置類TestConfig初始化Student對(duì)象,在測(cè)試類中,通過(guò)@Autowired注解自動(dòng)注入Student對(duì)象并輸出其屬性值,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • spring boot mybatis多數(shù)據(jù)源解決方案過(guò)程解析

    spring boot mybatis多數(shù)據(jù)源解決方案過(guò)程解析

    這篇文章主要介紹了spring boot mybatis多數(shù)據(jù)源解決方案過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

馆陶县| 武强县| 巴东县| 襄垣县| 合作市| 巴林右旗| 镇原县| 宁安市| 郓城县| 天水市| 都匀市| 益阳市| 都江堰市| 岢岚县| 香格里拉县| 丹凤县| 永兴县| 兴安盟| 松潘县| 灵璧县| 皋兰县| 呼伦贝尔市| 尼勒克县| 福海县| 揭东县| 宁河县| 平阴县| 双城市| 临沂市| 涿州市| 马公市| 开原市| 全南县| 光泽县| 长沙县| 九寨沟县| 凉山| 内丘县| 新宾| 哈巴河县| 房产|