過濾器放在了logback-classic模塊中。app
分類(2種):常規過濾器、TurboFilter過濾器。ide
常規過濾器能夠經過自定義進行條件篩選過濾。this
目前logback-classic中有2個常規過濾器:級別過濾器(LevelFilter)、臨界值過濾器(ThresholdFilter)。在logback-core中還有一個求值過濾器(EvaluatorFilter)。lua
建立自定義過濾器很容易,只須要繼承Filter抽象類並實現decide()方法。spa
下面就經過範例來了解如何建立自定義過濾器吧。3d
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
級別過濾器xml配置示例:blog
這個配置表示:當級別爲INFO時,decide()方法會響應ACCEPT;不然響應DENY。
<filter>標籤包含3個子標籤:<level> 、<onMatch> 、<onMismatch>。
<level>功能: 用於指定過濾的級別。
<onMatch>功能:指定級別匹配時響應的值。值爲FilterReply的枚舉。
<onMismatch>功能:指定級別不匹配時響應的值。值爲FilterReply的枚舉。
FilterReply的值:ACCEPT 、NEUTRAL、DENY。
臨界值過濾器xml配置示例:
這個配置代表當級別等於或高於<filter>中的子標籤<level>指定的級別時,decide()方法會響應NEUTRAL;不然decide方法會響應DENY。
經常使用的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>子標籤。
想要自定義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過濾器。 配置文件以下所示:
logback-classic實現的TurboFilter過濾器(2種):MDCFilter、MarkerFilter。
注意:<turboFilter>標籤在<appender>標籤外面。
MarkerFilter會檢查與記錄事件相關聯的某個特定marker是否存在,從而決定響應哪一個值(ACCEPT 、NEUTRAL 、DENY)。
配置以下:
重複消息過濾器也是TurboFilter過濾器的一種。
重複消息過濾器的配置以下:
logback-core中只包含了求值過濾器,可是求值過濾器是一個抽象類。
求值過濾器也是有一個常規過濾器。
1.求值過濾器(EvaluatorFilter)