(六)Logback中的Filter

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 规律型过滤器继承自Filter抽象类,该类主要由带有ILoggingEvent参数的decide()方法组成。多个过滤器会基于三进制规则进行排序,每个过滤器的decide(ILoggingEvent event)方法依次会被调用,该方法返回FilterReply的枚举值,例如:DENY、NEUTRAL、ACCEPT。如果方法返回值为DENY,那么日志对象会被终止而不会被其它过滤器访问。

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


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

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>

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>
<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>
相关文章
|
缓存 Java API
logback配置
一、logback介绍 logback分成三个模块:logback-core,logback- classic,logback-access。 logback-core:提供了logBack的核心功能,是另外两个组件的基础; logback-classic:实现了SLF4J API; logback
742 0
|
Java API 网络性能优化
NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
报错日志: java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy at ch.
11226 0
|
7月前
|
JavaScript 前端开发 Java
若依部署-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error]
若依部署-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error]
|
8月前
|
监控 Java 测试技术
日志框架到底是Logback 还是 Log4j2
日志框架到底是Logback 还是 Log4j2
54 0
|
XML 安全 Java
logback的使用和配置|logback比log4j的优点|logback是一个更好的log4j
logback的使用和配置|logback比log4j的优点|logback是一个更好的log4j
|
XML 安全 Oracle
logback的使用和logback.xml详解
logback的使用和logback.xml详解
452 0
|
监控 Java Shell
(二)Logback配置
Logback通过加载配置文件的方式来初始化配置,配置文件的加载顺序如下: 1)Logback首先会去类路径下找名为logback-test.xml的文件。 2)如果没有找到如上文件,会去类路径下找名为logback.groovy的文件。 3)如果没有找到如上文件,会去类路径下找名logback.xml的文件。
(二)Logback配置
(四)Logback中的Encoder
ncoder负责转换日志事件为字节数组并将字节数组输出到输出流中,编码器是在logback 0.9.19版本中引入的,以前老版本中大多数appenders依赖layout转换日志事件,然后使用java.io.Writer写入。先前版本中,用户通常会在FileAppender中嵌PatternLayout,从logback 0.9.19版本开始,FileAppender和它的子类只需配置Encoder即可,而不再需要配置Layout。
|
Java jenkins Linux
Logback使用总结
整理了下logback的常用点功能,并记录了一些在使用过程中的疑问,和问题的排错过程,防止自己再犯类似错误,也希望对路过的你有所帮助。
709 0