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)

相關文章
相關標籤/搜索