java日志框架系列(9):logback框架过滤器(filter)详解

过滤器放在了logback-classic模块中。app

1.logback-classic模块中过滤器

分类(2种):常规过滤器、TurboFilter过滤器。ide

1.常规过滤器

 

常规过滤器能够经过自定义进行条件筛选过滤。this

目前logback-classic中有2个常规过滤器级别过滤器(LevelFilter)临界值过滤器(ThresholdFilter)。在logback-core中还有一个求值过滤器(EvaluatorFilter)。lua

1.自定义过滤器

建立自定义过滤器很容易,只须要继承Filter抽象类并实现decide()方法spa

下面就经过范例来了解如何建立自定义过滤器吧。3d

1.范例

功能:自定义 SampleFilter 类,当记录事件的消息字段包含字符串“sample”时,它的 decide
方法返回 ACCEPT,其余状况下返回 NEUTRAL。
步骤:(2步)
1.建立继承Filter抽象类的Sample类并实现decide()方法。
2.在xml配置文件中配置过滤器。
 
定义过滤器SampleFilter,代码以下:
public class SampleFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (event.getMessage() != null && event.getMessage().contains("sample")) {
        return FilterReply.ACCEPT;
     } else {
        return FilterReply.NEUTRAL; } 
  }
}

配置xml配置文件,代码以下:code

 

 

 

 

 

match就是匹配的意思,那mismatch固然就是不匹配啦。orm

 因为常规过滤器能够根据事件包含的某些信息进行过滤,那么固然能够根据级别进行过滤了。下面介绍一下级别过滤器:xml

1.级别过滤器(LevelFilter)

 

 级别过滤器xml配置示例:blog

 

这个配置表示:当级别为INFO时,decide()方法会响应ACCEPT;不然响应DENY。

 <filter>标签包含3个子标签:<level> 、<onMatch> 、<onMismatch>。

<level>功能: 用于指定过滤的级别。

<onMatch>功能:指定级别匹配时响应的值。值为FilterReply的枚举。

<onMismatch>功能:指定级别不匹配时响应的值。值为FilterReply的枚举。

 FilterReply的值:ACCEPT 、NEUTRAL、DENY。

2.临界值过滤器(ThresholdFilter)

 

 临界值过滤器xml配置示例:

 

 这个配置代表当级别等于或高于<filter>中的子标签<level>指定的级别时,decide()方法会响应NEUTRAL;不然decide方法会响应DENY。

2.TurboFilter过滤器

经常使用的TurboFilter过滤器(3类):MDCFilterMarkerFilterDuplicateFilter

TurboFilter过滤器与常规过滤器做用范围不一样。

常规过滤器Filter做用范围:仅仅是某个logger。若是与这个loggerA关联的appenderB中配置了常规过滤器C,那么每当这个loggerA发起记录请求的时候都会调用这个常规过滤器C。可是未与appenderB关联的logger发起记录请求时没法调用这个常规过滤器C。

TurboFilter过滤器做用范围:整个Logger上下文。就是全部的logger发起记录请求时都会调用这个TurboFilter类型过滤器。

根据他们的做用范围不一样,所以咱们能够猜想出在配置文件中他们所处的位置确定是不一样的

过滤器位置

  常规过滤器Filter位置:位于appender内。常规过滤器用<filter>标签,是<appender>的子标签。

  TurboFilter过滤器位置:位于configuration内。TurboFilter过滤器用<turboFilter>标签,是<configuration>子标签。

 1.自定义TurboFilter过滤器

想要自定义TurboFilter过滤器,必须建立一个类,且该类必须继承TurboFilter抽象类并实现decide()方法

下面咱们经过示例来了解一下如何建立自定义TurboFilter过滤器。

建立并使用自定义TurboFilter过滤器步骤(2步):

  1.建立继承TurboFilter抽象类的类SampleTurboFilter。

  2.在xml配置文件中配置TurboFilter过滤器。

示例:

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();     }
 }
}
上面的 TurboFilter 接受包含特定 marker 的事件。若是上述 marker 未找到,则把任务交给过滤器链里的下一个过滤器。

下面在配置文件中使用自定义的TurboFilter过滤器。 配置文件以下所示:

 

2.logback-classic中直接使用的TurboFilter过滤器

 

logback-classic实现的TurboFilter过滤器(2种):MDCFilterMarkerFilter。 

 1.MDCFilter过滤器介绍

MDCFilter 类检查在 MDC 里是否存在一个给定值,从而决定响应哪一个值(ACCEPT 、NEUTRAL 、DENY)。
配置以下

注意:<turboFilter>标签在<appender>标签外面。

 

2.MarkerFilter过滤器介绍

MarkerFilter会检查与记录事件相关联的某个特定marker是否存在,从而决定响应哪一个值(ACCEPT 、NEUTRAL 、DENY)。

配置以下:

 3.重复消息过滤器(DuplicateMessageFilter)

重复消息过滤器也是TurboFilter过滤器的一种。

 重复消息过滤器的配置以下:

 

 

 

2.logback-core模块中的过滤器

logback-core中只包含了求值过滤器,可是求值过滤器是一个抽象类。

求值过滤器也是有一个常规过滤器

1.求值过滤器(EvaluatorFilter)

相关文章
相关标签/搜索