• 聊聊logback的EvaluatorFilter


    本文主要研究一下logback的EvaluatorFilter

    EvaluatorFilter

    ch/qos/logback/core/filter/EvaluatorFilter.java

    public class EvaluatorFilter extends AbstractMatcherFilter {
    
        EventEvaluator evaluator;
    
        @Override
        public void start() {
            if (evaluator != null) {
                super.start();
            } else {
                addError("No evaluator set for filter " + this.getName());
            }
        }
    
        public EventEvaluator getEvaluator() {
            return evaluator;
        }
    
        public void setEvaluator(EventEvaluator 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;
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    EvaluatorFilter继承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)为true时返回onMatch,否则返回onMismatch,异常的话返回NEUTRAL

    EventEvaluator

    ch/qos/logback/core/boolex/EventEvaluator.java

    public interface EventEvaluator extends ContextAware, LifeCycle {
    
        /**
         * Evaluates whether the event passed as parameter matches some user-specified
         * criteria.
         * 
         * 

    * The Evaluator is free to evaluate the event as it pleases. In * particular, the evaluation results may 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); }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    EventEvaluator接口定义了evaluate、getName、setName方法

    EventEvaluatorBase

    ch/qos/logback/core/boolex/EventEvaluatorBase.java

    abstract public class EventEvaluatorBase extends ContextAwareBase implements EventEvaluator {
    
        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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    EventEvaluatorBase声明实现EventEvaluator,它主要是定义了name、started属性,另外还有一个抽象子类为EventEvaluatorBase,而JaninoEventEvaluatorBase抽象子类继承了EventEvaluatorBase,它们有基于IAccessEvent,也有基于ILoggingEvent。

    OnMarkerEvaluator

    ch/qos/logback/classic/boolex/OnMarkerEvaluator.java

    public class OnMarkerEvaluator extends EventEvaluatorBase {
    
        List markerList = new ArrayList();
    
        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 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    OnMarkerEvaluator继承了EventEvaluatorBase,其evaluate从ILoggingEvent获取markerListInEvent,然后判断markerListInEvent是否有包含指定的markerStr

    OnErrorEvaluator

    ch/qos/logback/classic/boolex/OnErrorEvaluator.java

    public class OnErrorEvaluator extends EventEvaluatorBase {
    
        /**
         * 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    OnErrorEvaluator继承了EventEvaluatorBase,其evaluate方法根据event的level来判断看是否大于等于ERROR级别

    JaninoEventEvaluatorBase

    ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java

    abstract public class JaninoEventEvaluatorBase extends EventEvaluatorBase {
    
        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);
            }
        }
    
        //......
    }            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    JaninoEventEvaluatorBase在start的时候先通过getDecoratedExpression获取修饰之后的表达式,然后创建ScriptEvaluator,evaluate方法则通过getParameterValues从event提取参数,然后通过scriptEvaluator.evaluate获取结果

    示例

    			
                  
                      consoleOnly
                  
                  DENY
                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这里配置了EvaluatorFilter,其evaluator为OnMarkerEvaluator,包含consoleOnly这个marker时返回true,命中返回DENY

    小结

    logback的EvaluatorFilter继承了AbstractMatcherFilter,其decide方法在evaluator.evaluate(event)为true时返回onMatch,否则返回onMismatch,异常的话返回NEUTRAL。evaluator主要有OnMarkerEvaluator、OnErrorEvaluator以及JaninoEventEvaluatorBase系列的evaluator;JaninoEventEvaluatorBase它可以定义expression,通过ScriptEvaluator进行evaluate。

  • 相关阅读:
    (02)Cartographer源码无死角解析-(18) SensorBridge→landmark与Imu的数据处理
    【若依vue框架学习】6.分页
    vc版本与vs版本对应关系
    知名插画师走尺,带你走进“薪”世界
    如何用AR Engine环境Mesh能力实现虚实遮挡
    利用XtraDiagram.DiagramControl进行流程图形的绘制和控制
    我的前端成长之路:中医药大学毕业的业务女前端修炼之路
    浅谈数据仓库架构设计
    2023-2024山东大学移动互联网开发期末回忆
    测试之路-我曾经跨过无数Bug,也怼过各种开发
  • 原文地址:https://blog.csdn.net/hello_ejb3/article/details/134457054