一、Logback中Filter的種類
在logback-classic中,提供了兩種類型的filter:regular過濾器和turbo過濾器。
1、Regular過濾器
規律型過濾器繼承自Filter抽象類,該類主要由帶有ILoggingEvent參數的decide()方法組成。多個過濾器會基於三進制規則進行排序,每個過濾器的decide(ILoggingEvent event)方法依次會被調用,該方法返回FilterReply的枚舉值,例如:DENY、NEUTRAL、ACCEPT。如果方法返回值爲DENY,那麼日誌對象會被終止而不會被其它過濾器訪問。如果方法返回值爲NEUTRAL,那麼下一個過濾器會進行處理,如果沒有其餘過濾器,那麼日誌會被正常處理。如果方法返回值爲ACCEPT,那麼日誌對象會跳過其餘過濾器被立即處理。
1.1 自定義過濾器
package chapters.filters;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class SampleFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if (event.getMessage().contains("sample")) {
return FilterReply.ACCEPT;
} else {
return FilterReply.NEUTRAL;
}
}
}
logback配置文件如下:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="chapters.filters.SampleFilter" />
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="STDOUT" />
</root>
</configuration>
1.2 LevelFilter(級別過濾器)
LevelFilter基於匹配的具體級別過濾事件,如果日誌事件的級別等於配置的級別,那麼過濾器會接受或者拒絕日誌事件,這取決於配置的onMatch和onMisMatch屬性,如下:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
1.3 ThresholdFilter(閥值過濾器)
ThresholdFilter會過濾低於指定閥值的日誌事件,對於等於或者大於閥值的日誌事件,該過濾器會響應NEUTRAL,而對於低於閥值的日誌事件,改過濾器會響應DENY。如下:
<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
1.4 其它過濾器
EvaluatorFilter:這是包裝了EventEvaluator的通用過濾器,見名知義,EventEvaluator會根據指定條件是否滿足對日誌事件進行判斷是接收還是拒絕,該過濾器是一個抽象類。
該過濾器具體實現有:
GEventEvaluator:基於Groovy語言布爾表達式作爲判斷條件。
JaninoEventEvaluator:基於返回布爾值的Java語言塊作爲判斷條件,具體配置參考配置表。
示例1:GEventEvaluator
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
<expression>
e.level.toInt() >= WARN.toInt() && <!-- Stands for && in XML -->
!(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>NEUTRAL</OnMatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
示例2:JanioEventEvaluator
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>