随笔 - 22, 文章 - 0, 评论 - 1, 引用 - 0
数据加载中……

logback_doc_manual_07_filters

http://logback.qos.ch/manual/filters.html
logback-classic有两种filter:Regular filters和turbo filters,挂在appender上
Regular filters
     只有一个decide()方法,返回DENY, NEUTRAL or ACCEPT
LevelFilter
     <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
     </filter>
ThresholdFilter
     高于或等于指定日志级别的记录,会返回NEUTRAL
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
     </filter>     
EvaluatorFilter
     EventEvaluator的实现判断某个条件是否满足。
     
     GEventEvaluator
          接受groovy语法的布尔表达式作为判断条件,需要依赖Groovy运行时,表达式语句在配置的时候完成编译。
          logback会自动将目标事件作为一个变量传进来,可以用“event”或者“e”来引用。
          TRACE, DEBUG, INFO, WARN and ERROR这些级别也引入了,所以可以这样判断相等: "event.level == DEBUG" 。
          其他比较符,大于小于,需要转换成int再比较。
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
        <expression>
           e.level.toInt() >= WARN.toInt() &amp;&amp;  <!-- Stands for && in XML -->
           !(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
        </expression>
      </evaluator>
      <OnMismatch>DENY</OnMismatch>
      <OnMatch>NEUTRAL</OnMatch>
    </filter>
     JaninoEventEvaluator
          使用java表达式,使用上比基于groovy的GEventEvaluator繁琐,但执行速度更快。
          详情略。
          
Matchers
     执行上面的过滤器时,可以调用String.matches()方法,但代价是每次需要重编译一个正则Pattern对象。
     所以可以预先定义和编译一个,以便复用。
     详情略。
TurboFilters
     跟普通过滤器功能一样,但是:
          1,TurboFilter是跟logging context关联的,而不是跟appender关联。作用域更大。不仅在指定appender使用时,而且在每次logging请求时都会被调用。
          2,他们是在LoggingEvent对象创建之前被调用,过滤时不需要event实例做参数,所以性能更高(因为在event创建之前就已经执行过滤了)。
     内置了一些TurboFilter:
          MDCFilter     测试指定的值是否存在于MDC中
          DynamicThresholdFilter     基于MDC的key和level来限流
          MarkerFilter     测试指定的marker是否出现在请求中
          DuplicateMessageFilter
               自动过滤相同的消息。
                    使用简单的字符串比对——即使两个字符串基本相同,相差一两个字母:也会被认为不同。
                    仅比较raw字符串,用{}转义过的字符串不去比较。
                    可以通过AllowedRepetitions设置允许的重复上限,超过上限的会被抛弃。默认大小为5
                    需要通过一个内部cache来保存老的消息以便判断,可以通过CacheSize设置缓存大小,默认100.
          
在evaluator的expression里,将logging时间与项目启动时间对比,可以控制仅输出“项目启动后20秒内的某类型日志”——这个对于“确认某个定时任务在启动时是运行状态”很有用,例如:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <evaluator name="loggingTaskEval">
    <expression>
      logger.getName().contains("LoggingTask") &amp;&amp;
      message.contains("Howdydy-diddly-ho") &amp;&amp;
      (timeStamp - event.getStartTime()) >= 20000
    </expression>
  </evaluator>
  <OnMatch>DENY</OnMatch>
</filter>

posted on 2014-07-13 18:59 王星游 阅读(410) 评论(0)  编辑  收藏 所属分类: java


只有注册用户登录后才能发表评论。


网站导航: