log4j2使用filter過(guò)濾日志方式
背景說(shuō)明
log4j2作為log4j的升級(jí)版本,其性能自然是大大優(yōu)于log4j的,同時(shí)其其性能又是優(yōu)于logback的,甚至在部分領(lǐng)域,log4j2的性能遠(yuǎn)超logback幾個(gè)數(shù)量級(jí)。 ??
log4j2的亮點(diǎn)主要在這幾個(gè)方法進(jìn)行體現(xiàn):異步、并發(fā)、配置優(yōu)化、插件機(jī)制等。本文初步學(xué)習(xí)基于log4j2插件機(jī)制的Filter。
Filter.Result的三種過(guò)濾結(jié)果
log4j2走過(guò)濾器的邏輯后,會(huì)返回對(duì)應(yīng)的過(guò)濾Result結(jié)果,以控制是否記錄日志、怎樣記錄日志。過(guò)濾器的結(jié)果有:
ACCEPT
:(不需要再走后面的過(guò)濾器了,)需要記錄當(dāng)前日志。NEUTRAL
:需不需要記錄當(dāng)前日志,由后續(xù)過(guò)濾器決定。若所有過(guò)濾器返回的結(jié)果都是NEUTRAL,那么需要記錄日志。DENY
:(不需要再走后面的過(guò)濾器了,)不需要記錄當(dāng)前日志。
提示:log4j2的此機(jī)制與logback是一樣的。
log4j2提供的過(guò)濾器(功能簡(jiǎn)述)
提示: 下圖基于log4j2.13.3。
過(guò)濾器 | 說(shuō)明 | 是否常用 |
---|---|---|
StringMatchFilter | 如果格式化后(即:最終)的日志信息中包含${指定的字符串},則onMatch,否則onMismatch 即: msg.contains(this.text) ? onMatch : onMismatch; | 是 |
LevelRangeFilter | 若${maxLevel} <= 日志級(jí)別 <= ${minLevel}, 則onMatch,否則onMismatch 如: 即為只記錄日志info及warn級(jí)別的日志。 | 是 |
RegexFilter | 如果日志信息匹配${指定的正則表達(dá)式},則onMatch,否則onMismatch 注:可通過(guò)useRawMsg屬性來(lái)控制這個(gè)日志信息是格式化處理后(即:最終)的日志信息,還是格式化處理前(即:代碼中輸入)的日志信息。 | 是 |
ThresholdFilter | 若日志級(jí)別 >= ${指定的日志級(jí)別}, 則onMatch,否則onMismatch | 是 |
LevelMatchFilter | 如果日志級(jí)別等于${指定的日志級(jí)別},則onMatch,否則onMismatch | 是 |
ThreadContextMapFilter | 通過(guò)context(可以理解為一個(gè)Map)中對(duì)應(yīng)的key-value值進(jìn)行過(guò)濾 注:上下文默認(rèn)是ThreadContext,也可以自定義使用ContextDataInjectorFactory配置ContextDataInjector來(lái)指定。 | 是 |
DynamicThresholdFilter | 若上下文中包含指定的key,則觸發(fā)DynamicThresholdFilter生效;若該key對(duì)應(yīng)的value值等于任意一個(gè)我們指定的值,那么針對(duì)本條日志,可記錄日志級(jí)別的約束下限調(diào)整為指定的級(jí)別 注:上下文默認(rèn)是ThreadContext,也可以自定義使用ContextDataInjectorFactory配置ContextDataInjector來(lái)指定。 示例說(shuō)明:<DynamicThresholdFilter key="loginRole" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"><KeyValuePair key="admin" value="DEBUG"/><KeyValuePair key="user" value="warn"/></DynamicThresholdFilter>配置,有以下情況: 情況一:存在鍵loginRole,假設(shè)從上下文(可以理解為一個(gè)Map)中取出來(lái)的對(duì)應(yīng)的值為user,那么此時(shí),對(duì)于日志級(jí)別大于等于warn的日志,會(huì)走onMatch;其它的日志級(jí)別走onMismatch。 情況二:存在鍵loginRole,假設(shè)從context(可以理解為一個(gè)Map)中取出來(lái)的對(duì)應(yīng)的值為admin,那么此時(shí),對(duì)于日志級(jí)別大于等于debug的日志,會(huì)走onMatch;其它的日志級(jí)別走onMismatch。 情況三:【上下文(可以理解為一個(gè)Map)中,不存在鍵loginRole】或【存在鍵loginRole,但從日志上下文中取出來(lái)的值(假設(shè))為abc, 沒(méi)有對(duì)應(yīng)的KeyValuePair配置】,那么此時(shí)<DynamicThresholdFilter key="userRole" defaultThreshold="AAA" onMatch="BBB" onMismatch="CCC">等價(jià)于<LevelMatchFilter level="AAA" onMatch="BBB" onMismatch="CCC">。 | 是 |
CompositeFilter | 組合過(guò)濾器,即:按照xml配置中的配置,一個(gè)過(guò)濾器一個(gè)過(guò)濾器的走,如果在這過(guò)程中,任意一個(gè)過(guò)濾器ACCEPT或DENY了,那么就不會(huì)往后走了,直接返回對(duì)應(yīng)的結(jié)果。 | 是 |
TimeFilter | 如果記錄日志時(shí)的當(dāng)前時(shí)間落在每天指定的時(shí)間范圍[start, end]內(nèi),則onMatch,否則onMismatch 如:<TimeFilter start="05:00:00" end="05:30:00" onMatch="ACCEPT" onMismatch="DENY"/>。 | 否 |
ScriptFilter | 是否匹配取決于指定的腳本返回值是否為true | 否 |
DenyAllFilter | This filter causes all logging events to be dropped | 否 |
BurstFilter | 對(duì)低于或等于${指定日志級(jí)別}的日志,進(jìn)行限流控制 | 否 |
NoMarkerFilter | 如果從對(duì)應(yīng)事件對(duì)象獲取(LogEvent#getMarker)到的marker為null, 則onMatch,否則onMismatch | 否 |
MarkerFilter | 如果從對(duì)應(yīng)事件對(duì)象獲取(LogEvent#getMarker)到的marker的name值為等于${指定的值}, 則onMatch,否則onMismatch | 否 |
MapFilter | The MapFilter allows filtering against data elements that are in a MapMessage. 注:需要使用org.apache.logging.log4j.Logger進(jìn)行記錄,且記錄org.apache.logging.log4j.message.MapMessage日志,才會(huì)生效。 注:因?yàn)闀簳r(shí)不兼容Slf4j這里不多作說(shuō)明 | 否 |
StructuredDataFilter | The StructuredDataFilter is a MapFilter that also allows filtering on the event id, type and message. 注:需要使用org.apache.logging.log4j.Logger進(jìn)行記錄,且記錄org.apache.logging.log4j.core.filter.StructuredDataFilter日志,才會(huì)生效。 注:因?yàn)闀簳r(shí)不兼容Slf4j這里不多作說(shuō)明 | 否 |
… | … | … |
Filter的作用范圍
log4j2在處理日志時(shí),各個(gè)Filter會(huì)組成過(guò)濾鏈,越靠前的Filter越先過(guò)濾,自然影響范圍就越大。在log4j2的xml配置文件中,F(xiàn)ilter可以配置在四個(gè)位置,由全局到局部依次是 Context-wide、 Logger和Appender、AppenderReference, 圖示說(shuō)明:
常用過(guò)濾器使用示例(文字版代碼見(jiàn)文末鏈接)
StringMatchFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
LevelRangeFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
RegexFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
ThresholdFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
LevelMatchFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
ThreadContextMapFilter
示例一: log4j2.xml配置
測(cè)試代碼與輸出日志
示例二: log4j2.xml配置
測(cè)試代碼與輸出日志
DynamicThresholdFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
CompositeFilter
log4j2.xml配置
測(cè)試代碼與輸出日志
自定義Filter
一般來(lái)說(shuō),log4j2官方提供的過(guò)濾器就足夠我們使用了,如果非要自定義過(guò)濾器,可以繼承AbstractFilter,或者直接實(shí)現(xiàn)Filter,這里不再演示自定義過(guò)濾器。
更多可見(jiàn):
https://logging.apache.org/log4j/2.x/manual/filters.html
http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/filter/
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)畫(huà)線、矩形、橢圓、字符串功能
本篇文章主要介紹了Java實(shí)現(xiàn)畫(huà)線、矩形、橢圓、字符串功能的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Spring Boot讀取resources目錄文件方法詳解
這篇文章主要介紹了Spring Boot讀取resources目錄文件方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Springboot中yml對(duì)于list列表配置方式詳解
這篇文章主要介紹了Springboot中yml對(duì)于list列表配置方式詳解,使用@ConfigurationProperties讀取yml配置文件過(guò)程中會(huì)遇到讀取yml文件中列表,Config里面使用List集合接收,方法比較簡(jiǎn)單,需要的朋友可以參考下2023-11-11Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01