Logback中如何自定義靈活的日誌過濾規則
當我們需要對日誌的列印要做一些範圍的控制的時候,通常都是通過為各個Appender設定不同的Filter配置來實現。在Logback中自帶了兩個過濾器實現:ch.qos.logback.classic.filter.LevelFilter
和ch.qos.logback.classic.filter.ThresholdFilter
,使用者可以根據需要來配置一些簡單的過濾規則,下面先簡單介紹一下這兩個原生的基礎過濾器。
ch.qos.logback.classic.filter.LevelFilter
過濾器的作用是通過比較日誌級別來控制日誌輸出。下面是一個只記錄日誌級別為ERROR的例子:
< appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/error.log</file>ds
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
< onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
</encoder>
</appender>
LevelFilter
通過定義日誌級別,並設定匹配與不匹配的處理策略來控制針對某個級別日誌的輸出策略。當我們要設定多個不同級別的日誌策略的時候,如果僅依靠這個過濾器,我們就要級聯的定義多個filter來控制才能實現,顯然不是很方便,所以此時我們就可以使用ch.qos.logback.classic.filter.ThresholdFilter
<appender name="WARN_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/warn_error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
</encoder>
</appender>
通過上述介紹的兩個過濾器來控制日誌的記錄級別已經滿足絕大部分的需求,但是可能還是會出現一些特殊情況,需要自定義複雜的過濾規則,比如想過濾掉一些框架中的日誌,通過自帶的幾個過濾器已經無法完全控制,並且也不希望修改框架原始碼來實現。這個時候,我們就可以自己來實現過濾器,並配置使用。實現的方式也很簡單,只需要實現Logback提供的ch.qos.logback.core.filter.Filter
介面即可。
下面舉一個簡單的例子:
public class MyFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if (event.getLevel() == Level.ERROR) {
switch (event.getLoggerName()) {
case "org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter":
return FilterReply.DENY;
}
return FilterReply.ACCEPT;
}
return FilterReply.DENY;
}
}
上面過濾器的功能主要是通過重寫decide
,限制了org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter
類輸出ERROR級別的日誌記錄。在編寫好自己的過濾器實現之後,只需要在Appender中配置使用就能實現自己需要的靈活過濾規則了:
<appender name="WARN_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/warn_error.log</file>
<filter class="com.didispace.log.filter.ExceptionClassFilter"></filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
</encoder>
</appender>