Java日志框架——Logback的Filter

一、作用

在Logback中有两种方法去控制某个日志记录请求是否有效:一种是比较日志记录请求的Level值是否大于等于相应的日志记录类实例的Level值;另外一种是配置Filter类实例,Filter类实例的方法比前一种方法更加灵活和强大,它的关注点可以不仅仅限于Level值的比较,也可以关注记录内容等。


二、分类与配置

Logback中有两类Filter,一类是Regular Filter;另外一类是Turbo Filter。
2.1、Regular Filter
Regular Filter继承实现"ch.qos.logback.core.filter.Filter"类,调用Regular Filter实例能够得到3种结果,分别是“DENY, NEUTRAL和ACCEPT”。Regular Filter实例被绑定在Appender实例上,Appender实例上可以绑定一个Regular Filter实例链。当该Appender实例被调用时,被绑定的Regular Filter实例链中的每个Regular Filter实例会被依次调用,当某个Regular Filter实例被调用返回的结果是"DENY"时,直接拒绝日志记录请求;返回的结果是"ACCEPT"时,直接通过日志记录请求;返回的结果是"NEUTRAL"时,继续调用链中的下一个Regular Filter实例。
Logback中已经实现的常见的Regular Filter有"ch.qos.logback.classic.filter.LevelFilter","ch.qos.logback.classic.filter.ThresholdFilter","ch.qos.logback.core.filter.EvaluatorFilter"。


2.1.1、ch.qos.logback.classic.filter.LevelFilter
比较日志记录请求的Level值和LevelFilter中配置的Level值,返回LevelFilter中配置的结果值。

配置举例:

<configuration>  
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
    <filter class="ch.qos.logback.classic.filter.LevelFilter">  
      <level>INFO</level>  
      <onMatch>ACCEPT</onMatch>  
      <onMismatch>DENY</onMismatch>  
    </filter>  
    <encoder>  
      <pattern>  
        %-4relative [%thread] %-5level %logger{30} - %msg%n  
      </pattern>  
    </encoder>  
  </appender>  
  <root level="DEBUG">  
    <appender-ref ref="CONSOLE" />  
  </root>  
</configuration>  

2.1.2、ch.qos.logback.classic.filter.ThresholdFilter

比较日志记录请求的Level值和ThresholdFilter中配置的Level值,当日志记录请求的Level值小于ThresholdFilter中配置的Level值,日志记录请求被判定为无效。
配置举例:

<configuration>  
  <appender name="CONSOLE"  
    class="ch.qos.logback.core.ConsoleAppender">  
    <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->  
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
      <level>INFO</level>  
    </filter>  
    <encoder>  
      <pattern>  
        %-4relative [%thread] %-5level %logger{30} - %msg%n  
      </pattern>  
    </encoder>  
  </appender>  
  <root level="DEBUG">  
    <appender-ref ref="CONSOLE" />  
  </root>  
</configuration>  

2.1.3、ch.qos.logback.core.filter.EvaluatorFilter

EvaluatorFilter中可以配置"groovy evaluation expressions"或者"java evaluation expressions",从而可以更加灵活地确定日志记录请求过滤的条件。条件的内容可以不仅限于Level值,也可以是日志记录内容,日志记录时间,MDC内容等等。
配置举例:

<configuration>  
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">        
      <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->  
        <expression>return message.contains("billing");</expression>  
      </evaluator>  
      <OnMismatch>NEUTRAL</OnMismatch>  
      <OnMatch>DENY</OnMatch>  
    </filter>  
    <encoder>  
      <pattern>  
        %-4relative [%thread] %-5level %logger - %msg%n  
      </pattern>  
    </encoder>  
  </appender>  
  
  <root level="INFO">  
    <appender-ref ref="STDOUT" />  
  </root>  
</configuration>  

2.2、Turbo Filter

Turbo Filter继承实现"ch.qos.logback.classic.turbo.TurboFilter"类,调用Turbo Filter实例能够得到3种结果,分别是“DENY, NEUTRAL和ACCEPT”。Turbo Filter和Regular Filter主要有两点不同:一个是作用域;另一个是作用时机。
Regular Filter的作用域跟绑定它的Appender的作用域一致,只有当Appender被调用时,绑定在它上面的Regular Filter才能得到调用;而Turbo Filter的作用域是Logback上下文环境中的全局作用域,每个日志记录请求的触发都能引起Turbo Filter的调用。
Regular Filter的作用时机是在“根据日志记录请求(LoggingRequest)得到一个日志记录事件(LoggingEvent)”之后,即彼时已经有“LoggingEvent”生成;Turbo Filter的作用时机是在“根据日志记录请求(LoggingRequest)得到一个日志记录事件(LoggingEvent)”之前,即彼时还没有"LoggingEvent"生成。
Logback中已经实现的常见的Turbo Filter有:"ch.qos.logback.classic.turbo.DuplicateMessageFilter"。


2.2.1、ch.qos.logback.classic.turbo.DuplicateMessageFilter
过滤掉重复记录内容的日志记录请求。
配置举例:

package chapters.filters;

import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;

public class SampleTurboFilter extends TurboFilter {

  String marker;
  Marker markerToAccept;

  @Override
  public FilterReply decide(Marker marker, Logger logger, Level level,
      String format, Object[] params, Throwable t) {

    if (!isStarted()) {
      return FilterReply.NEUTRAL;
    }

    if ((markerToAccept.equals(marker))) {
      return FilterReply.ACCEPT;
    } else {
      return FilterReply.NEUTRAL;
    }
  }

  public String getMarker() {
    return marker;
  }

  public void setMarker(String markerStr) {
    this.marker = markerStr;
  }

  @Override
  public void start() {
    if (marker != null && marker.trim().length() > 0) {
      markerToAccept = MarkerFactory.getMarker(marker);
      super.start(); 
    }
  }
}


<configuration>  
  <turboFilter class="chapters.filters.SampleTurboFilter">  
    <Marker>sample</Marker>  
  </turboFilter>  
  
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
    <encoder>  
      <pattern>  
        %-4relative [%thread] %-5level %logger - %msg%n  
      </pattern>  
    </encoder>  
  </appender>  
  
  <root>  
    <appender-ref ref="STDOUT" />  
  </root>  
</configuration>  

参考文献:

[1]http://logback.qos.ch/manual/filters.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值