小編給大家分享一下log4j2如何使用filter過濾日志,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
log4j2作為log4j的升級版本,其性能自然是大大優于log4j的,同時其其性能又是優于logback的,甚至在部分領域,log4j2的性能遠超logback幾個數量級。 ??
log4j2的亮點主要在這幾個方法進行體現:異步、并發、配置優化、插件機制等。本文初步學習基于log4j2插件機制的Filter。
log4j2走過濾器的邏輯后,會返回對應的過濾Result結果,以控制是否記錄日志、怎樣記錄日志。過濾器的結果有:
ACCEPT
:(不需要再走后面的過濾器了,)需要記錄當前日志。
NEUTRAL
:需不需要記錄當前日志,由后續過濾器決定。若所有過濾器返回的結果都是NEUTRAL,那么需要記錄日志。
DENY
:(不需要再走后面的過濾器了,)不需要記錄當前日志。
提示:log4j2的此機制與logback是一樣的。
提示: 下圖基于log4j2.13.3。
過濾器 | 說明 | 是否常用 |
---|---|---|
StringMatchFilter | 如果格式化后(即:最終)的日志信息中包含${指定的字符串},則onMatch,否則onMismatch 即: msg.contains(this.text) ? onMatch : onMismatch; | 是 |
LevelRangeFilter | 若${maxLevel} <= 日志級別 <= ${minLevel}, 則onMatch,否則onMismatch 如: 即為只記錄日志info及warn級別的日志。 | 是 |
RegexFilter | 如果日志信息匹配${指定的正則表達式},則onMatch,否則onMismatch 注:可通過useRawMsg屬性來控制這個日志信息是格式化處理后(即:最終)的日志信息,還是格式化處理前(即:代碼中輸入)的日志信息。 | 是 |
ThresholdFilter | 若日志級別 >= ${指定的日志級別}, 則onMatch,否則onMismatch | 是 |
LevelMatchFilter | 如果日志級別等于${指定的日志級別},則onMatch,否則onMismatch | 是 |
ThreadContextMapFilter | 通過context(可以理解為一個Map)中對應的key-value值進行過濾 注:上下文默認是ThreadContext,也可以自定義使用ContextDataInjectorFactory配置ContextDataInjector來指定。 | 是 |
DynamicThresholdFilter | 若上下文中包含指定的key,則觸發DynamicThresholdFilter生效;若該key對應的value值等于任意一個我們指定的值,那么針對本條日志,可記錄日志級別的約束下限調整為指定的級別 注:上下文默認是ThreadContext,也可以自定義使用ContextDataInjectorFactory配置ContextDataInjector來指定。 示例說明:<DynamicThresholdFilter key="loginRole" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"><KeyValuePair key="admin" value="DEBUG"/><KeyValuePair key="user" value="warn"/></DynamicThresholdFilter>配置,有以下情況: 情況一:存在鍵loginRole,假設從上下文(可以理解為一個Map)中取出來的對應的值為user,那么此時,對于日志級別大于等于warn的日志,會走onMatch;其它的日志級別走onMismatch。 情況二:存在鍵loginRole,假設從context(可以理解為一個Map)中取出來的對應的值為admin,那么此時,對于日志級別大于等于debug的日志,會走onMatch;其它的日志級別走onMismatch。 情況三:【上下文(可以理解為一個Map)中,不存在鍵loginRole】或【存在鍵loginRole,但從日志上下文中取出來的值(假設)為abc, 沒有對應的KeyValuePair配置】,那么此時<DynamicThresholdFilter key="userRole" defaultThreshold="AAA" onMatch="BBB" onMismatch="CCC">等價于<LevelMatchFilter level="AAA" onMatch="BBB" onMismatch="CCC">。 | 是 |
CompositeFilter | 組合過濾器,即:按照xml配置中的配置,一個過濾器一個過濾器的走,如果在這過程中,任意一個過濾器ACCEPT或DENY了,那么就不會往后走了,直接返回對應的結果。 | 是 |
TimeFilter | 如果記錄日志時的當前時間落在每天指定的時間范圍[start, end]內,則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 | 對低于或等于${指定日志級別}的日志,進行限流控制 | 否 |
NoMarkerFilter | 如果從對應事件對象獲取(LogEvent#getMarker)到的marker為null, 則onMatch,否則onMismatch | 否 |
MarkerFilter | 如果從對應事件對象獲取(LogEvent#getMarker)到的marker的name值為等于${指定的值}, 則onMatch,否則onMismatch | 否 |
MapFilter | The MapFilter allows filtering against data elements that are in a MapMessage. 注:需要使用org.apache.logging.log4j.Logger進行記錄,且記錄org.apache.logging.log4j.message.MapMessage日志,才會生效。 注:因為暫時不兼容Slf4j這里不多作說明 | 否 |
StructuredDataFilter | The StructuredDataFilter is a MapFilter that also allows filtering on the event id, type and message. 注:需要使用org.apache.logging.log4j.Logger進行記錄,且記錄org.apache.logging.log4j.core.filter.StructuredDataFilter日志,才會生效。 注:因為暫時不兼容Slf4j這里不多作說明 | 否 |
… | … | … |
log4j2在處理日志時,各個Filter會組成過濾鏈,越靠前的Filter越先過濾,自然影響范圍就越大。在log4j2的xml配置文件中,Filter可以配置在四個位置,由全局到局部依次是 Context-wide、 Logger和Appender、AppenderReference, 圖示說明:
log4j2.xml配置
測試代碼與輸出日志
log4j2.xml配置
測試代碼與輸出日志
log4j2.xml配置
測試代碼與輸出日志
log4j2.xml配置
測試代碼與輸出日志
log4j2.xml配置
測試代碼與輸出日志
示例一: log4j2.xml配置
測試代碼與輸出日志
示例二: log4j2.xml配置
測試代碼與輸出日志
log4j2.xml配置
測試代碼與輸出日志
log4j2.xml配置
測試代碼與輸出日志
以上是“log4j2如何使用filter過濾日志”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。