(六)Logback中的Filter

一、Logback中Filter的種類

在logback-classic中,提供了兩種類型的filter:regular過濾器和turbo過濾器。

1、Regular過濾器

規律型過濾器繼承自Filter抽象類,該類主要由帶有ILoggingEvent參數的decide()方法組成。多個過濾器會基於三進制規則進行排序,每個過濾器的decide(ILoggingEvent event)方法依次會被調用,該方法返回FilterReply的枚舉值,例如:DENY、NEUTRAL、ACCEPT。如果方法返回值爲DENY,那麼日誌對象會被終止而不會被其它過濾器訪問。如果方法返回值爲NEUTRAL,那麼下一個過濾器會進行處理,如果沒有其餘過濾器,那麼日誌會被正常處理。如果方法返回值爲ACCEPT,那麼日誌對象會跳過其餘過濾器被立即處理。

1.1 自定義過濾器

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;
    }
  }
}

logback配置文件如下:

<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>

1.2 LevelFilter(級別過濾器)

LevelFilter基於匹配的具體級別過濾事件,如果日誌事件的級別等於配置的級別,那麼過濾器會接受或者拒絕日誌事件,這取決於配置的onMatch和onMisMatch屬性,如下:

<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>
</configuration>

1.3 ThresholdFilter(閥值過濾器)

ThresholdFilter會過濾低於指定閥值的日誌事件,對於等於或者大於閥值的日誌事件,該過濾器會響應NEUTRAL,而對於低於閥值的日誌事件,改過濾器會響應DENY。如下:

<configuration>
  <appender name="CONSOLE"
    class="ch.qos.logback.core.ConsoleAppender">
    <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      </pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>
</configuration>

1.4 其它過濾器

EvaluatorFilter:這是包裝了EventEvaluator的通用過濾器,見名知義,EventEvaluator會根據指定條件是否滿足對日誌事件進行判斷是接收還是拒絕,該過濾器是一個抽象類。

該過濾器具體實現有:

GEventEvaluator:基於Groovy語言布爾表達式作爲判斷條件。

JaninoEventEvaluator:基於返回布爾值的Java語言塊作爲判斷條件,具體配置參考配置表

示例1:GEventEvaluator

<configuration>
    
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
        <expression>
           e.level.toInt() >= WARN.toInt() &amp;&amp;  <!-- Stands for && in XML -->
           !(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
        </expression>
      </evaluator>
      <OnMismatch>DENY</OnMismatch>
      <OnMatch>NEUTRAL</OnMatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger - %msg%n
      </pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

示例2:JanioEventEvaluator

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
      <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
        <expression>return message.contains("billing");</expression>
      </evaluator>
      <OnMismatch>NEUTRAL</OnMismatch>
      <OnMatch>DENY</OnMatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger - %msg%n
      </pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章