logback使用filter過濾日志操作
筆者語錄: 我發(fā)現(xiàn)我喜歡搗鼓一些小玩意兒,雖然官網(wǎng)(見文末)寫得很明白了,但是咱們對(duì)感興趣的部分來敲一遍代碼好吧。
過濾器簡(jiǎn)介:
簡(jiǎn)介
logback具有過濾器支持。logbcak允許給日志記錄器appender配置一個(gè)或多個(gè)Filter(或者給整體配置一個(gè)或多個(gè)TurboFilter),來控制:當(dāng)滿足過濾器指定的條件時(shí),才記錄日志(或不滿足條件時(shí),拒絕記錄日志)。logback支持自定義過濾器,當(dāng)然logback也自帶了一些常用的過濾器,在絕大多數(shù)時(shí)候,自帶的過濾器其實(shí)就夠用了,一般是不需要自定義過濾器的。
logback提供的過濾器支持主要分兩大類
ch.qos.logback.core.filter.Filter
ch.qos.logback.classic.turbo.TurboFilter
過濾器 | 來源 | 說明 | 相對(duì)常用 |
---|---|---|---|
LevelFilter | Filter | 對(duì)指定level的日志進(jìn)行記錄(或不記錄),對(duì)不等于指定level的日志不記錄(或進(jìn)行記錄) | 是 |
ThresholdFilter | Filter | 對(duì)大于或等于指定level的日志進(jìn)行記錄(或不記錄),對(duì)小于指定level的日志不記錄(或進(jìn)行記錄) 提示:info級(jí)別是大于debug的 |
是 |
EvaluatorFilter | Filter | 對(duì)滿足指定表達(dá)式的日志進(jìn)行記錄(或不記錄),對(duì)不滿足指定表達(dá)式的日志不作記錄(或進(jìn)行記錄) | 是 |
MDCFilter | TurboFilter | 若MDC域中存在指定的key-value,則進(jìn)行記錄,否者不作記錄 | 是 |
DuplicateMessageFilter | TurboFilter | 根據(jù)配置不記錄多余的重復(fù)的日志 | 是 |
MarkerFilter | TurboFilter | 針對(duì)帶有指定標(biāo)記的日志,進(jìn)行記錄(或不作記錄) | 否 |
… | … | … | … |
若過濾器已經(jīng)返回了需要記錄,那么就一定會(huì)對(duì)該日志進(jìn)行記錄(不論當(dāng)前日志的level是否大于等于系統(tǒng)設(shè)置的最低日志級(jí)別)。
TurboFilter的性能是優(yōu)于Filter的,這是因?yàn)門urboFilter的作用時(shí)機(jī)是在創(chuàng)建日志事件ILoggingEvent對(duì)象之前,而Filter的作用時(shí)機(jī)是在創(chuàng)建之后。若一個(gè)日志注定是會(huì)被過濾掉不記錄的,那么創(chuàng)建ILoggingEvent對(duì)象(包括后續(xù)的參數(shù)組裝方法調(diào)用等)這個(gè)步驟無疑是非常消耗性能的。
過濾器的FilterReply狀態(tài)枚舉:
對(duì)于Filter而言,需不需要記錄日志,取決于ch.qos.logback.core.filter.Filter#decide方法的返回:
Filter與TurboFilter自帶的幾種常用過濾器
對(duì)于TurboFilter而言,需不需要記錄日志,取決于ch.qos.logback.classic.turbo.TurboFilter#decide方法的返回:
可以看到,返回的都是FilterReply這個(gè)枚舉:
FilterReply有三種枚舉值:
DENY:表示不用看后面的過濾器了,這里就給拒絕了,不作記錄。
NEUTRAL:表示需不需要記錄,還需要看后面的過濾器。若所有過濾器返回的全部都是NEUTRAL,那么需要記錄日志。
ACCEPT:表示不用看后面的過濾器了,這里就給直接同意了,需要記錄。
過濾器的使用(示例):
使用LevelFilter的logback.xml(示例):
測(cè)試一下:
編寫測(cè)試方法:
運(yùn)行方法,產(chǎn)出日志:
使用ThresholdFilter的logback.xml(示例):
測(cè)試一下:
編寫測(cè)試方法:
運(yùn)行方法,產(chǎn)出日志:
使用EvaluatorFilter的logback.xml(示例):
需要引入額外的解析庫(kù)依賴janino:
<dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>3.1.2</version> </dependency>
logbaxk.xml
測(cè)試一下:
編寫測(cè)試方法:
運(yùn)行方法,產(chǎn)出日志:
使用MDCFilter的logback.xml(示例):
測(cè)試一下:
編寫測(cè)試方法:
運(yùn)行方法,產(chǎn)出日志:
自定義過濾器:
自定義Filter:
編寫自定義Filter
在logback.xml中配置使用此過濾器
測(cè)試一下:
編寫測(cè)試方法:
運(yùn)行方法,產(chǎn)出日志:
自定義TurboFilter:
編寫自定義TurboFilter
在logback.xml中配置使用此過濾器
測(cè)試一下:
編寫測(cè)試方法:
運(yùn)行方法,產(chǎn)出日志:
logback使用filter過濾日志,初步學(xué)習(xí)完畢!
以上這篇logback使用filter過濾日志操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA?2022?中的Lombok?使用基礎(chǔ)教程
? Lombok是使用java編寫的一款開源類庫(kù)。其主作用是使用注解來代替一些具有格式固定,沒有過多技術(shù)含量的編碼工作,這篇文章主要介紹了IDEA?2022?中的Lombok?使用基礎(chǔ)教程,需要的朋友可以參考下2022-12-12flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板實(shí)現(xiàn)demo
這篇文章主要為大家介紹了flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05java使用Filter實(shí)現(xiàn)自動(dòng)登錄的方法
這篇文章主要為大家詳細(xì)介紹了java使用Filter實(shí)現(xiàn)自動(dòng)登錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java在長(zhǎng)字符串中查找短字符串的實(shí)現(xiàn)多種方法
這篇文章主要介紹了Java在長(zhǎng)字符串中查找短字符串的實(shí)現(xiàn)多種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Spring Cloud Gateway 如何修改HTTP響應(yīng)信息
這篇文章主要介紹了Spring Cloud Gateway 修改HTTP響應(yīng)信息的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程)
這篇文章主要介紹了IntelliJ IDEA2021.1 配置大全(超詳細(xì)教程),需要的朋友可以參考下2021-04-04java 壓縮和解壓縮Zip、Jar、Gzip文件實(shí)例代碼
本文主要介紹java壓縮和解壓縮Zip、Jar、Gzip文件的知識(shí),這里整理了相關(guān)資料,并附示例代碼有興趣的小伙伴可以參考下2016-09-09java使用gzip實(shí)現(xiàn)文件解壓縮示例
這篇文章主要介紹了java使用gzip實(shí)現(xiàn)文件解壓縮示例,需要的朋友可以參考下2014-03-03SpringBoot項(xiàng)目中HTTP請(qǐng)求體只能讀一次的解決方案
在基于Spring開發(fā)Java項(xiàng)目時(shí),可能需要重復(fù)讀取HTTP請(qǐng)求體中的數(shù)據(jù),例如使用攔截器打印入?yún)⑿畔⒌?但當(dāng)我們重復(fù)調(diào)用getInputStream()或者getReader()時(shí),通常會(huì)遇到SpringBoot HTTP請(qǐng)求只讀一次的問題,本文給出了幾種解決方案,需要的朋友可以參考下2024-08-08