开发者

logback EvaluatorFilter日志过滤器源码解读

开发者 https://www.devze.com 2023-11-19 10:24 出处:网络 作者: codecraft
目录序EvaLuatorFilterEventEvaluatorEventEvaluatorBaseOnMarkerEvaluatorOnErrorEvaluatorJaninoEventEvaluatorBase示例小结序
目录
  • EvaLuatorFilter
  • EventEvaluator
    • EventEvaluatorBase
    • OnMarkerEvaluator
    • OnErrorEvaluator
    • JaninoEventEvaluatorBase
  • 示例
    • 小结

      本文主要研究一下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 fijslter " + this.getName());
              }
          }
          public EventEvaluator<E> getEvaluatorhttp://www.devze.com() {
              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, EvaluatipythononException;
          /**
           * 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声明实现Evwww.devze.comentEvaluator,它主要是定义了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方法根据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获取修饰之后的表达式,然后创建ScriptEvaluator,evaluate方法则通过getParameterValues从event提取参数,然后通过scriptEvaluator.evaluate获编程取结果

      示例

      <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

      小结

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

      以上就是logback EvaluatorFilter日志过滤器源码解读的详细内容,更多关于logback EvaluatorFilter日志过滤器的资料请关注编程客栈(www.devze.com)其它相关文章!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号