Logback 提供兩種類型的過(guò)濾器,常規(guī)過(guò)濾器和turbo過(guò)濾器檩赢。本例講述基于常規(guī)過(guò)濾器的自定義實(shí)現(xiàn)他膳。
常規(guī)過(guò)濾器
常規(guī)的logback-classic過(guò)濾器擴(kuò)展了 Filter
抽象類,它基本上由一個(gè)decide()
以ILoggingEvent
實(shí)例作為參數(shù)的方法組成 。
過(guò)濾器基于三元邏輯拉宗。decide(ILoggingEvent event)
按順序調(diào)用每個(gè)過(guò)濾器的方法。此方法返回的一個(gè) FilterReply
枚舉值,即DENY
搓茬、 NEUTRAL
或ACCEPT
犹赖。
枚舉值 | 含義 |
---|---|
DENY | 立即刪除日志事件而不咨詢剩余的過(guò)濾器 |
NEUTRAL | 查詢列表中的下一個(gè)過(guò)濾器,如果沒(méi)有其他過(guò)濾器可供參考卷仑,則會(huì)正常處理日志記錄事件 |
ACCEPT | 立即處理日志事件峻村,跳過(guò)其余過(guò)濾器的調(diào)用 |
在 logback 中,可以將過(guò)濾器添加到 Appender
實(shí)例中锡凝。通過(guò)向 appender 添加一個(gè)或多個(gè)過(guò)濾器粘昨,可以按任意條件過(guò)濾事件。
實(shí)現(xiàn)自己的過(guò)濾器
創(chuàng)建自己的過(guò)濾器很簡(jiǎn)單窜锯。所要做的就是擴(kuò)展Filter
抽象類并實(shí)現(xiàn)該 decide()
方法张肾。
下面顯示的 SampleFilter 類提供了一個(gè)示例。其 decide
方法返回 ACCEPT 以記錄其消息字段中包含字符串 “sample” 的事件锚扎。對(duì)于其他事件吞瞪,返回值 NEUTRAL。
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;
}
}
}
接下來(lái)顯示的配置文件將過(guò)濾器 SampleFilter 附加到 ConsoleAppender驾孔。
<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>
如果想設(shè)置過(guò)濾器的屬性或子組件也很容易芍秆。在過(guò)濾器類中添加相應(yīng)的setter方法后,在屬性命名的xml元素中指定屬性的值翠勉,并將其嵌套在<filter>
元素中妖啥。
如將 SampleFilter 中的用于判斷的字符串 "sample" 字符提取到配置文件中:
- SampleFilter 增加屬性
flag
,并提供 set 方法眉菱。
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> {
private String flag;
@Override
public FilterReply decide(ILoggingEvent event) {
if (event.getMessage().contains(flag)) {
return FilterReply.ACCEPT;
} else {
return FilterReply.NEUTRAL;
}
}
public void setFlag(String flag) {
this.flag = flag;
}
}
- 在配置文件中指定
flag
的值迹栓。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="chapters.filters.SampleFilter" >
<flag>sample</flag>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="STDOUT" />
</root>
</configuration>