Java日誌框架——Logback的Filter

文章轉載自:http://blog.csdn.net/dslztx/article/details/47733127

一、作用

在Logback中有兩種方法去控制某個日誌記錄請求是否有效:一種是比較日誌記錄請求的Level值是否大於等於相應的日誌記錄類實例的Level值;另外一種是配置Filter類實例,Filter類實例的方法比前一種方法更加靈活和強大,它的關注點可以不僅僅限於Level值的比較,也可以關注記錄內容等。


二、分類與配置

Logback中有兩類Filter,一類是Regular Filter;另外一類是Turbo Filter。
2.1、Regular Filter
Regular Filter繼承實現"ch.qos.logback.core.filter.Filter"類,調用Regular Filter實例能夠得到3種結果,分別是“DENY, NEUTRAL和ACCEPT”。Regular Filter實例被綁定在Appender實例上,Appender實例上可以綁定一個Regular Filter實例鏈。當該Appender實例被調用時,被綁定的Regular Filter實例鏈中的每個Regular Filter實例會被依次調用,當某個Regular Filter實例被調用返回的結果是"DENY"時,直接拒絕日誌記錄請求;返回的結果是"ACCEPT"時,直接通過日誌記錄請求;返回的結果是"NEUTRAL"時,繼續調用鏈中的下一個Regular Filter實例。
Logback中已經實現的常見的Regular Filter有"ch.qos.logback.classic.filter.LevelFilter","ch.qos.logback.classic.filter.ThresholdFilter","ch.qos.logback.core.filter.EvaluatorFilter"。


2.1.1、ch.qos.logback.classic.filter.LevelFilter
比較日誌記錄請求的Level值和LevelFilter中配置的Level值,返回LevelFilter中配置的結果值。
配置舉例:
[html] view plain copy
  1. <configuration>  
  2.   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
  3.     <filter class="ch.qos.logback.classic.filter.LevelFilter">  
  4.       <level>INFO</level>  
  5.       <onMatch>ACCEPT</onMatch>  
  6.       <onMismatch>DENY</onMismatch>  
  7.     </filter>  
  8.     <encoder>  
  9.       <pattern>  
  10.         %-4relative [%thread] %-5level %logger{30} - %msg%n  
  11.       </pattern>  
  12.     </encoder>  
  13.   </appender>  
  14.   <root level="DEBUG">  
  15.     <appender-ref ref="CONSOLE" />  
  16.   </root>  
  17. </configuration>  


2.1.2、ch.qos.logback.classic.filter.ThresholdFilter

比較日誌記錄請求的Level值和ThresholdFilter中配置的Level值,當日志記錄請求的Level值小於ThresholdFilter中配置的Level值,日誌記錄請求被判定爲無效。
配置舉例:
[html] view plain copy
  1. <configuration>  
  2.   <appender name="CONSOLE"  
  3.     class="ch.qos.logback.core.ConsoleAppender">  
  4.     <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->  
  5.     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
  6.       <level>INFO</level>  
  7.     </filter>  
  8.     <encoder>  
  9.       <pattern>  
  10.         %-4relative [%thread] %-5level %logger{30} - %msg%n  
  11.       </pattern>  
  12.     </encoder>  
  13.   </appender>  
  14.   <root level="DEBUG">  
  15.     <appender-ref ref="CONSOLE" />  
  16.   </root>  
  17. </configuration>  


2.1.3、ch.qos.logback.core.filter.EvaluatorFilter

EvaluatorFilter中可以配置"groovy evaluation expressions"或者"java evaluation expressions",從而可以更加靈活地確定日誌記錄請求過濾的條件。條件的內容可以不僅限於Level值,也可以是日誌記錄內容,日誌記錄時間,MDC內容等等。
配置舉例:
[html] view plain copy
  1. <configuration>  
  2.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  3.     <filter class="ch.qos.logback.core.filter.EvaluatorFilter">        
  4.       <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->  
  5.         <expression>return message.contains("billing");</expression>  
  6.       </evaluator>  
  7.       <OnMismatch>NEUTRAL</OnMismatch>  
  8.       <OnMatch>DENY</OnMatch>  
  9.     </filter>  
  10.     <encoder>  
  11.       <pattern>  
  12.         %-4relative [%thread] %-5level %logger - %msg%n  
  13.       </pattern>  
  14.     </encoder>  
  15.   </appender>  
  16.   
  17.   <root level="INFO">  
  18.     <appender-ref ref="STDOUT" />  
  19.   </root>  
  20. </configuration>  


2.2、Turbo Filter

Turbo Filter繼承實現"ch.qos.logback.classic.turbo.TurboFilter"類,調用Turbo Filter實例能夠得到3種結果,分別是“DENY, NEUTRAL和ACCEPT”。Turbo Filter和Regular Filter主要有兩點不同:一個是作用域;另一個是作用時機。
Regular Filter的作用域跟綁定它的Appender的作用域一致,只有當Appender被調用時,綁定在它上面的Regular Filter才能得到調用;而Turbo Filter的作用域是Logback上下文環境中的全局作用域,每個日誌記錄請求的觸發都能引起Turbo Filter的調用。
Regular Filter的作用時機是在“根據日誌記錄請求(LoggingRequest)得到一個日誌記錄事件(LoggingEvent)”之後,即彼時已經有“LoggingEvent”生成;Turbo Filter的作用時機是在“根據日誌記錄請求(LoggingRequest)得到一個日誌記錄事件(LoggingEvent)”之前,即彼時還沒有"LoggingEvent"生成。
Logback中已經實現的常見的Turbo Filter有:"ch.qos.logback.classic.turbo.DuplicateMessageFilter"。


2.2.1、ch.qos.logback.classic.turbo.DuplicateMessageFilter
過濾掉重複記錄內容的日誌記錄請求。
配置舉例:
[html] view plain copy
  1. <configuration>  
  2.   <turboFilter class="chapters.filters.SampleTurboFilter">  
  3.     <Marker>sample</Marker>  
  4.   </turboFilter>  
  5.   
  6.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  7.     <encoder>  
  8.       <pattern>  
  9.         %-4relative [%thread] %-5level %logger - %msg%n  
  10.       </pattern>  
  11.     </encoder>  
  12.   </appender>  
  13.   
  14.   <root>  
  15.     <appender-ref ref="STDOUT" />  
  16.   </root>  
  17. </configuration>  


參考文獻:

[1]http://logback.qos.ch/manual/filters.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章