跳至主要內容

Filters

Jin大约 2 分钟

Filters

1、简介

logback 过滤器基于三元逻辑,允许它们组装或者链接在一起组成一个任意复杂的过滤策略。它们在很大程度上受到 Linux iptables 的启发。

在 logback-classic 中,有两种类型的过滤器,regular 过滤器以及 turbo 过滤器。

2、LevelFilter

LevelFilteropen in new window 基于级别来过滤日志事件。如果事件的级别与配置的级别相等,过滤器会根据配置的 onMatchonMismatch 属性,接受或者拒绝事件。如下是一个简单的示例:

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

3、ThresholdFilter

ThresholdFilteropen in new window 基于给定的临界值来过滤事件。如果事件的级别等于或高于给定的临界值,当调用 decide() 时,ThresholdFilter 将会返回 NEUTRAL。但是事件的级别低于临界值将会被拒绝。下面是一个简单的例子:

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

4、自定义过滤器

创建一个自己的过滤器非常的简单。只需要继承 Filter 并且实现 decide() 方法就可以了。

如下所示的 SampleFilter 就是一个简单的例子。如果日志事件包含字符 "sample", decide 方法返回 ACCEPT。对于其他的日志事件,则返回 NEUTRAL。

下面是关于将 SampleFilter 添加到 ConsoleAppender 上的配置示例:

Example: SampleFilterConfig.xml

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

在 logback 配置框架 Joran 的帮助下,为过滤器指定属性或者子组件也变得更加的简单。在过滤器类中添加相应的 set 方法,通过 <filter> 元素嵌套一个以属性命名的 xml 元素中指定属性的值。

通常情况下,过滤器的逻辑由两个正交的部分组成,match/mismatch 的检验以及基于 match/mismatch 的返回值。例如,对于给定的检验,消息等于 "foobar",一个过滤器在 match 的情况下返回 ACCEPT,在 mismatch 的情况下返回 NEUTRAL。另一个过滤可能在 match 的情况下返回 NEUTRAL,在 mismatch 的情况下返回 DENY。

注意这种正交,logback 附带了一个 AbstractMatcherFilteropen in new window 类,提供了一个有用的骨架用来指定在 match 与 mismatch 情况下的返回值,这两个属性名分别叫做 OnMatchOnMismatch。logback 中大部分的 regular 过滤器都源于 AbstractMatcherFilter

贡献者: Jin