java日志框架系列(9):logback框架過濾器(filter)詳解


過濾器放在了logback-classic模塊中。

1.logback-classic模塊中過濾器

分類(2種):常規過濾器、TurboFilter過濾器。

1.常規過濾器

 

常規過濾器可以通過自定義進行條件篩選過濾。

目前logback-classic中有2個常規過濾器級別過濾器(LevelFilter)臨界值過濾器(ThresholdFilter)。在logback-core中還有一個求值過濾器(EvaluatorFilter)。

1.自定義過濾器

創建自定義過濾器很容易,只需要繼承Filter抽象類並實現decide()方法

下面就通過范例來了解如何創建自定義過濾器吧。

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配置文件,代碼如下:

 

 

 

 

 

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

 由於常規過濾器可以根據事件包含的某些信息進行過濾,那么當然可以根據級別進行過濾了。下面介紹一下級別過濾器:

1.級別過濾器(LevelFilter)

 

 級別過濾器xml配置示例:

 

這個配置表示:當級別為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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM