logback使用filter过滤日志

笔者语录 我发现我喜欢捣鼓一些小玩意儿,虽然官网(见文末)写得很明白了,但是咱们对感兴趣的部分来敲一遍代码好吧。


过滤器简介

  • 简介
      logback具有过滤器支持。logbcak允许给日志记录器appender配置一个或多个Filter(或者给整体配置一个或多个TurboFilter),来控制:当满足过滤器指定的条件时,才记录日志(或不满足条件时,拒绝记录日志)。logback支持自定义过滤器,当然logback也自带了一些常用的过滤器,在绝大多数时候,自带的过滤器其实就够用了,一般是不需要自定义过滤器的。

  • logback提供的过滤器支持主要分两大类

    • ch.qos.logback.core.filter.Filter
      在这里插入图片描述

    • ch.qos.logback.classic.turbo.TurboFilter
      在这里插入图片描述

  • Filter与TurboFilter自带的几种常用过滤器

过滤器来源说明相对常用
LevelFilterFilter对指定level的日志进行记录(或不记录),对不等于指定level的日志不记录(或进行记录)
ThresholdFilterFilter对大于或等于指定level的日志进行记录(或不记录),对小于指定level的日志不记录(或进行记录)
提示:info级别是大于debug的
EvaluatorFilterFilter对满足指定表达式的日志进行记录(或不记录),对不满足指定表达式的日志不作记录(或进行记录)
MDCFilterTurboFilter若MDC域中存在指定的key-value,则进行记录,否者不作记录
DuplicateMessageFilterTurboFilter根据配置不记录多余的重复的日志
DynamicThresholdFilterTurboFilter动态版的ThresholdFilter,根据MDC域中是否存在某个键,该键对应的值是否相等,可实现日志级别动态切换
示例:<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter"><DefaultThreshold>ERROR</DefaultThreshold><OnHigherOrEqual>ACCEPT</OnHigherOrEqual><OnLower>NEUTRAL</OnLower><Key>userRole</Key><MDCValueLevelPair><value>admin</value><level>DEBUG</level></MDCValueLevelPair><MDCValueLevelPair><value>dba</value><level>INFO</level></MDCValueLevelPair><MDCValueLevelPair><value>user</value><level>WARN</level></MDCValueLevelPair></turboFilter>此时,作用有以下几种情况:
情况一:MDC域中不存在对应的键userRole,或者存在对应的 键userRole,但是其值不等于任何一个MDCValueLevelPair中的value值。那么此时会以${DefaultThreshold}为界线,大于等于该级别的日志将会被${OnHigherOrEqual},小于该级别的日志将会被${OnLower}
情况二:MDC域中存在对应的键userRole,且其对应的值等于其中一个MDCValueLevelPair中的value值。那么此时会以该MDCValueLevelPair中的${level}为界线,大于等于该级别的日志将会被${OnHigherOrEqual},小于该级别的日志将会被${OnLower}
MarkerFilterTurboFilter针对带有指定标记的日志,进行记录(或不作记录)
  • 若过滤器已经返回了需要记录,那么就一定会对该日志进行记录(不论当前日志的level是否大于等于系统设置的最低日志级别)

  • TurboFilter的性能是优于Filter的,这是因为TurboFilter的作用时机是在创建日志事件ILoggingEvent对象之前,而Filter的作用时机是在创建之后。若一个日志注定是会被过滤掉不记录的,那么创建ILoggingEvent对象(包括后续的参数组装方法调用等)这个步骤无疑是非常消耗性能的。


过滤器的FilterReply状态枚举

  对于Filter而言,需不需要记录日志,取决于ch.qos.logback.core.filter.Filter#decide方法的返回:
在这里插入图片描述
  对于TurboFilter而言,需不需要记录日志,取决于ch.qos.logback.classic.turbo.TurboFilter#decide方法的返回:
在这里插入图片描述
  可以看到,返回的都是FilterReply这个枚举:
在这里插入图片描述

  • FilterReply有三种枚举值:

    • DENY:表示不用看后面的过滤器了,这里就给拒绝了,不作记录。
    • NEUTRAL:表示需不需要记录,还需要看后面的过滤器。若所有过滤器返回的全部都是NEUTRAL,那么需要记录日志。
    • ACCEPT:表示不用看后面的过滤器了,这里就给直接同意了,需要记录。

过滤器的使用(示例)

使用LevelFilter的logback.xml(示例)

在这里插入图片描述
测试一下:

  • 编写测试方法:
    在这里插入图片描述

  • 运行方法,产出日志:
    在这里插入图片描述

使用ThresholdFilter的logback.xml(示例)

在这里插入图片描述

测试一下:

  • 编写测试方法:
    在这里插入图片描述
  • 运行方法,产出日志:
    在这里插入图片描述
使用EvaluatorFilter的logback.xml(示例)
  • 需要引入额外的解析库依赖janino:
    <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>janino</artifactId>
        <version>3.1.2</version>
    </dependency>
    
  • logbaxk.xml
    在这里插入图片描述

测试一下:

  • 编写测试方法:
    在这里插入图片描述
  • 运行方法,产出日志:
    在这里插入图片描述
使用MDCFilter的logback.xml(示例)

测试一下:
在这里插入图片描述

  • 编写测试方法:
    在这里插入图片描述
  • 运行方法,产出日志:
    在这里插入图片描述
使用DynamicThresholdFilter的logback.xml(示例)在这里插入图片描述

测试一下:

  • 编写测试方法:
    在这里插入图片描述
  • 运行方法,产出日志:
    在这里插入图片描述

自定义过滤器

自定义Filter
  • 编写自定义Filter
    在这里插入图片描述
  • 在logback.xml中配置使用此过滤器
    在这里插入图片描述
    测试一下:
  • 编写测试方法:
    在这里插入图片描述
  • 运行方法,产出日志:
    在这里插入图片描述
自定义TurboFilter
  • 编写自定义TurboFilter
    在这里插入图片描述

  • 在logback.xml中配置使用此过滤器
    在这里插入图片描述

测试一下:

  • 编写测试方法:
    在这里插入图片描述

  • 运行方法,产出日志:
    在这里插入图片描述


logback使用filter过滤日志,初步学习完毕!

^_^ 如有不当之处,欢迎指正

^_^ 参考链接
         http://logback.qos.ch/manual/filters.html

^_^ 测试代码托管链接
         https://github.com/JustryDeng…logback-Filter&TurboFilter…

^_^ 本文已经被收录进《程序员成长笔记》 ,笔者JustryDeng

  • 14
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
logback filter是一种用于过滤日志事件的机制。在logback框架中,可以使用自定义过滤器、规律型过滤器和ThresholdFilter实现日志过滤。 自定义过滤器是通过继承Filter抽象类并实现decide()方法来实现的。decide()方法接收一个ILoggingEvent参数,根据日志事件的内容或其他条件进行判断,返回FilterReply枚举值来决定是否接受该日志事件。 规律型过滤器也是继承自Filter抽象类,它们按照一定的顺序进行排序,并依次调用decide()方法。decide()方法返回的FilterReply枚举值决定了日志事件的处理方式,包括DENY、NEUTRAL和ACCEPT。如果返回DENY,日志事件将被终止;如果返回NEUTRAL,下一个过滤器将继续处理;如果返回ACCEPT,日志事件将被立即处理。 ThresholdFilter是一种特殊的过滤器,它根据指定的阈值过滤日志事件。对于低于阈值的日志事件,ThresholdFilter会响应DENY;对于等于或大于阈值的日志事件,ThresholdFilter会响应NEUTRAL。可以通过配置文件来设置ThresholdFilter的阈值。 以上是关于logback filter的一些介绍。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [(六)Logback中的Filter](https://blog.csdn.net/lingbomanbu_lyl/article/details/89881642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值