首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Logback logback.xml 過濾器詳解:LevelFilter、ThresholdFilter、EvaluatorFilter 實戰配置

     編輯:Java 綜合教學

Logback logback.xml 過濾器詳解:LevelFilter、ThresholdFilter、EvaluatorFilter 實戰配置

Logback 過濾器(<filter>)掛載在 <appender> 上,按順序處理日誌事件,返回 DENY(丟棄)、NEUTRAL(交給下一個)、ACCEPT(直接輸出)。本文詳解三大核心過濾器配置實戰。

1. LevelFilter:精確級別過濾

只保留指定級別日誌,其他丟棄:

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

2. ThresholdFilter:臨界值過濾

過濾掉低於閾值的日誌(如只保留 INFO 及以上):

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <!-- 過濾掉 TRACE 和 DEBUG -->
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>INFO</level>
  </filter>
  <encoder>...</encoder>
</appender>

行為:≥ 閾值返回 NEUTRAL(繼續),< 閾值返回 DENY(丟棄)。

3. EvaluatorFilter:表達式求值過濾(最強大)

基於 Janino 動態編譯 Java 布爾表達式,訪問日誌上下文字段:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator>  <!-- 默認 JaninoEventEvaluator -->
      <expression>return message.contains("billing");</expression>
    </evaluator>
    <OnMatch>ACCEPT</OnMatch>
    <OnMismatch>DENY</OnMismatch>
  </filter>
  <encoder>...</encoder>
</appender>

可用上下文字段

變量類型說明
messageString原始消息模板(如 "Hello {}")
formattedMessageString格式化後消息(如 "Hello World")
loggerStringLogger 名稱
levelint級別整數值(可 level > INFO)
mdcMapMDC 鍵值對(mdc.get("key"))
throwableProxyIThrowableProxy異常代理(遠程也可用)

Matcher:預編譯正則優化

避免重複編譯 Pattern,定義後在表達式中復用:

<evaluator>
  <matcher>
    <Name>odd</Name>
    <regex>statement [13579]</regex>
  </matcher>
  <expression>odd.matches(formattedMessage)</expression>
</evaluator>

實戰組合策略

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 1. 先用 ThresholdFilter 過濾低級別 -->
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>INFO</level>
  </filter>
  <!-- 2. 再用 EvaluatorFilter 過濾敏感信息 -->
  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator>
      <expression>!formattedMessage.contains("password")</expression>
    </evaluator>
    <OnMatch>NEUTRAL</OnMatch>
    <OnMismatch>DENY</OnMismatch>
  </filter>
  <encoder>...</encoder>
  <rollingPolicy>...</rollingPolicy>
</appender>

總結

  • LevelFilter:精確匹配單一級別
  • ThresholdFilter:截斷低級別,性能最好
  • EvaluatorFilter:複雜業務邏輯過濾,靈活但有編譯開銷
  • 多過濾器按聲明順序鏈式執行,善用 NEUTRAL 流轉
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved