`
dongmj
  • 浏览: 31791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

logback filters使用详解(二)

 
阅读更多

TurboFilters

TurboFilter对象全部继承于TurboFilter抽象类。像正则过滤器一样,它们都使用三进制逻辑返回对日志事件的判断。

它们的工作试类似于前面提到的过滤器。但,Filter与TurboFilter存在两点不一样。

TurboFilter对象绑定到日志上下文。因此,它们不光指定的appender被使用时触发,每一次日志请求也会触发。它们的应用范围远远大于appender附属的过滤器。

更重要的,它们会在LoggingEvent对象创建前被调用。TurboFilter对象过滤日志请求,不需要一个日志事件的实例化。因此,turboFilters用于高性能地过滤日志事件,即使在日志事件对象创建前。

 

实现自定义TruboFilter

只压根继承TurboFilter抽象类就可以创建自定义TurboFilter对象。像前面实现自定义过滤器一样,实现自定义过滤器只要实现decide()方法。下面的例子中,我们创建了一个稍微复杂的过滤器:

package chapters.filters;

import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;

public class SampleTurboFilter extends TurboFilter {

  String marker;
  Marker markerToAccept;

  @Override
  public FilterReply decide(Marker marker, Logger logger, Level level,
      String format, Object[] params, Throwable t) {

    if (!isStarted()) {
      return FilterReply.NEUTRAL;
    }

    if ((markerToAccept.equals(marker))) {
      return FilterReply.ACCEPT;
    } else {
      return FilterReply.NEUTRAL;
    }
  }

  public String getMarker() {
    return marker;
  }

  public void setMarker(String markerStr) {
    this.marker = markerStr;
  }

  @Override
  public void start() {
    if (marker != null && marker.trim().length() > 0) {
      markerToAccept = MarkerFactory.getMarker(marker);
      super.start(); 
    }
  }
}

 上面的TurboFilter接收饮食特殊标识的事件。如果未找到指定标识,过滤器则将责任传递给连上下一个过滤器。

为了增加灵活性,通过getter与setter,测试标识可能在配置文件中指定。我们也通过实现start()方法去验证在处理配置过程中选项是否已指定。

<configuration>
  <turboFilter class="chapters.filters.SampleTurboFilter">
    <Marker>sample</Marker>
  </turboFilter>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger - %msg%n
      </pattern>
    </encoder>
  </appender>

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

 Logback提供了一些TurboFilter类。MDCFilter用于验证是否存在指定值;DynamicThresholdFilter基于MDC的key与level阀值过滤。另一个方面,MarkerFilter用于验证日志请求中包含指定标识。

下面是应用MDCFilter与MarkerFilter的一个例子:

<configuration>

  <turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
    <MDCKey>username</MDCKey>
    <Value>sebastien</Value>
    <OnMatch>ACCEPT</OnMatch>
  </turboFilter>
        
  <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    <Marker>billing</Marker>
    <OnMatch>DENY</OnMatch>
  </turboFilter>

  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%date [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

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

 

DuplicateMessageFilter

DuplicateMessageFilter优点在与众不同。这个过滤器会监测重复的消息,超过一定数量后,会丢弃掉重复的消息。

为了监控重复,过滤器在消息中使用简单的String相等性。它不会监测到只有一些字符差异的非常相近的消息。例如:

logger.debug("Hello "+name0);
logger.debug("Hello "+name1);

 假设name0与name1有不同的值,则认为这两条"Hello"消息不相关。依赖于用户的使用,以后的发布版本有可能添加验证string相似性功能。

注意包含参数的日志情况,只有考虑到原始消息。例如:下面两个请求,原始消息为"Hello {}"一样,因此,它被视为重复。

重复的数量可能通过AllowedRepetitions属性配置。例如,如果属性值为1,则第2条及以后的相同消息会被丢弃。类似,如果属性值为2,则第3条及以后的相同消息会被丢弃。AllowedRepetitions默认值为5。

为了监测重复性,这个过滤器需要在内部缓存中保持旧消息的引用。这个缓存的大小取决于属性CacheSize。默认,属性值为100。

<configuration>

  <turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter"/>

  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%date [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

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

 因此,配置了上面过滤器的FilterEvents输出为:

 
2008-12-19 15:04:26,156 [main] INFO chapters.filters.FilterEvents - logging statement 0
2008-12-19 15:04:26,156 [main] INFO chapters.filters.FilterEvents - logging statement 1
2008-12-19 15:04:26,156 [main] INFO chapters.filters.FilterEvents - logging statement 2
2008-12-19 15:04:26,156 [main] INFO chapters.filters.FilterEvents - logging statement 4
2008-12-19 15:04:26,156 [main] INFO chapters.filters.FilterEvents - logging statement 5
2008-12-19 15:04:26,171 [main] ERROR chapters.filters.FilterEvents - billing statement 6

 “logging statement 0”是第一个"logging statement {}"的发生。"logging statement 1"是第1个重复,"logging statement 2"是第2个重复。有趣的是,虽然基本规则被丢弃了,DEBUG级别的"logging statement 3"是第3个重复。通过这个可以看出TurboFilter早于其它过滤器调用,包含基本规则。因此,DuplicateMessageFilter认为"logging statement 3"为重复。由于它被后面的连上的规则丢弃造成它常常被忘记。"logging statement 4"是第4个重复,"logging statement 5"第5个。由于默认只允许5个重复,Statements6以及之后的都将被丢弃。

 

logback-access

Logback-access提供了logback-classic里的大部分特点。特别是,除了一点不一样,Logback-access过滤器与Logback-classic采用一样的方式获得与工作。Logback-access通过AccessEvent取代LoggingEvent实例。现在,logback-access提供了下面介绍有限的过滤器。如果你想要建议增加过滤器,请联系logback邮件列表。

 

CountingFilter

通过CountingFilter,logback-access可以提供web-server的访问统计数据。初始化时,CountingFilter以MBean的形式将自己注册到JMX服务器。你可以通过访问那个MBean获取统计数据,如,每分钟、小时、天、星期、月平均值。其它统计,如,上周、前天、上一个小时、上个月的数量,以及获得的总数量。

下面的lobback-access.xml声明了一个CountingFilter:

 

<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />

  <filter class="ch.qos.logback.access.filter.CountingFilter">
    <name>countingFilter</name>
  </filter>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%h %l %u %t \"%r\" %s %b</pattern>
    </encoder>
  </appender>

  <appender-ref ref="STDOUT" />
</configuration>

 你可以通过jconsole查看JMX服务器上的任何统计数据

 

console使用界面

 

EvaluatorFilter

EvaluatorFilter是封装了EventEvaluator的泛型过滤器。就如名字介绍的,EventEvaluator判断指定事件是否满足条件。匹配与否,Evaluator会返回OnMatch与OnMismatch属性配置的值。EvaluatorFilter与前面类似,参考上一篇文章。

判断表达式用于处理当前访问事件。Logback-access自动将以event变量名,导入AccessEvent实例。你可以读取关于HTTP请求与响应的各种数据。

下面配置文件展示了过滤响应编码为404的,每个请求为404的都会打印到console中。

<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      <evaluator>
        <expression>event.getStatusCode() == 404</expression>
      </evaluator>
      <onMismatch>DENY</onMismatch>
    </filter>
   <encoder><pattern>%h %l %u %t %r %s %b</pattern></encoder>
  </appender>

  <appender-ref ref="STDOUT" />
</configuration>

 下面一个鸽子,我们过滤结果为404错误与请求CSS类型文件:

<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      <evaluator name="Eval404">
        <expression>
         (event.getStatusCode() == 404)
           &amp;&amp;  <!-- ampersand characters need to be escaped -->
         !(event.getRequestURI().contains(".css"))
        </expression>
      </evaluator>
      <onMismatch>DENY</onMismatch>
    </filter>

   <encoder><pattern>%h %l %u %t %r %s %b</pattern></encoder>
  </appender>

  <appender-ref ref="STDOUT" />
</configuration>

 

 

参考文档:https://logback.qos.ch/manual/filters.html 

0
0
分享到:
评论

相关推荐

    logback的使用和logback.xml详解

    标题"Logback的使用和logback.xml详解"暗示了我们要讨论的是一个日志管理框架——Logback,以及它的配置文件`logback.xml`。Logback是Java社区广泛使用的日志处理系统,由Ceki Gülcü创建,作为Log4j的后继者。它...

    logback配置详解

    logback 配置详解 logback 是由 log4j 创始人设计的另一个开源日志组件,它当前分为三个模块:logback-core、logback-classic 和 logback-access。logback-classic 是 log4j 的一个改良版本,同时它完整实现了 slf4...

    logback日志配制详解

    其中包含logback.xml配制详解,所配制的jar包,maven配制,我们项目的配制,里面还包含日志打包等

    Spring如何动态自定义logback日志目录详解

    "Spring如何动态自定义logback日志目录详解" 本文主要介绍了如何在Spring框架中动态自定义logback日志目录的相关知识点。 一、日志输出格式的重要性 在日常开发中,日志输出格式的指定是非常重要的。一般情况下,...

    Logback用户手册中文版

    3.3. 用 logback-test.xml 或 logback.xml 自动配置 ............................................... 19 3.4. 自动打印警告和错误消息 ...........................................................................

    logback-filters:用于获取事务信息、身份验证等的 Logback 过滤器

    "logback-filters" 是 Logback 的一个扩展模块,专门设计用于处理特定的过滤需求,如获取事务信息、身份验证数据等。在日志系统中,过滤器允许我们根据预定义的条件筛选和处理日志事件,从而提高日志的有效性和安全...

    logback使用方式简单总结

    Logback 使用 `logback.xml` 文件进行配置。配置文件中,你可以定义日志级别、过滤器、appender 和 layout。例如: ```xml &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt; &lt;pattern&gt;%d...

    slf4j日志demo项目 logback.xml配置详解

    slf4j日志demo项目 logback.xml配置详解,slf4j日志demo项目 logback.xml配置详解,slf4j日志demo项目 logback.xml配置详解,slf4j日志demo项目 logback.xml配置详解

    logback日志使用

    logback的使用,内附所需要的jar包以及使用步骤,希望给个为带来帮助

    LogBack日志的使用

    在使用LogBack时,需要引入对应的jar包。主要依赖包括`logback-classic`、`logback-core`和`slf4j-api`。`logback-classic`是实现SLF4J接口的具体日志实现,`logback-core`包含了LogBack的基本功能,而`slf4j-api`则...

    logback jar包和logback.xml配置文件打包下载 小白新手学Java

    学习和理解SLF4J与Logback的使用,对于Java开发者来说非常重要,它们能够帮助我们有效地管理和监控应用程序的运行状况。通过配置`logback.xml`,我们可以根据需求调整日志级别,定位问题,优化性能,甚至实现日志的...

    Spring Boot异步输出Logback日志方法详解

    【Spring Boot异步输出Logback日志方法详解】 在Spring Boot中,日志记录是一个重要的功能,用于跟踪应用程序的行为和调试问题。Logback是广泛使用的日志框架,由log4j的创始人Ceki Gülcü设计,提供了高效、灵活...

    logback高级使用例子

    **日志系统的重要性** ...通过深入理解和熟练使用Logback,我们可以优化日志记录,提升问题排查效率,为软件系统的稳定运行保驾护航。`logback-advance-demo`压缩包可能包含了上述功能的实践示例,供学习和参考。

    logback 配置详解.pdf

    Logback 是一款广泛使用的日志记录框架,它提供高效的日志记录功能,并允许灵活的配置。在本文中,我们将深入探讨 logback 的配置,重点放在配置文件中的关键元素上。 首先,配置文件的根节点是 `&lt;configuration&gt;`...

    使用Logback的10个理由

    以下是使用Logback的十个主要理由: 1. **性能优化**:Logback 相比于其他日志框架(如log4j)在性能上有所提升,处理速度更快,内存占用更小,这得益于其优化的基本架构和组件设计。 2. **模块化设计**:Logback ...

    日志文件:日志概念、LogBack日志技术的概述、使用、logback.xml配置文件详解

    日志文件:日志概念、LogBack日志技术的概述、使用、logback.xml配置文件详解

    SpringBoot之LogBack配置详解

    SpringBoot之LogBack配置详解 LogBack是基于Slf4j的日志框架,默认集成在Spring Boot中。默认情况下,Spring Boot是以INFO级别输出到控制台。LogBack的日志级别是:ALL 。 配置LogBack可以直接在application....

Global site tag (gtag.js) - Google Analytics