過濾器放在了logback-classic模塊中。
1.logback-classic模塊中過濾器
分類(2種):常規過濾器、TurboFilter過濾器。
1.常規過濾器
常規過濾器可以通過自定義進行條件篩選過濾。
目前logback-classic中有2個常規過濾器:級別過濾器(LevelFilter)、臨界值過濾器(ThresholdFilter)。在logback-core中還有一個求值過濾器(EvaluatorFilter)。
1.自定義過濾器
創建自定義過濾器很容易,只需要繼承Filter抽象類並實現decide()方法。
下面就通過范例來了解如何創建自定義過濾器吧。
1.范例
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類):MDCFilter、MarkerFilter、DuplicateFilter。
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過濾器。 配置文件如下所示:
2.logback-classic中直接使用的TurboFilter過濾器
logback-classic實現的TurboFilter過濾器(2種):MDCFilter、MarkerFilter。
1.MDCFilter過濾器介紹



注意:<turboFilter>標簽在<appender>標簽外面。
2.MarkerFilter過濾器介紹
MarkerFilter會檢查與記錄事件相關聯的某個特定marker是否存在,從而決定響應哪個值(ACCEPT 、NEUTRAL 、DENY)。
配置如下:
3.重復消息過濾器(DuplicateMessageFilter)
重復消息過濾器也是TurboFilter過濾器的一種。
重復消息過濾器的配置如下:
2.logback-core模塊中的過濾器
logback-core中只包含了求值過濾器,但是求值過濾器是一個抽象類。
求值過濾器也是有一個常規過濾器。
1.求值過濾器(EvaluatorFilter)