log4j2使用filter过滤日志方式

 更新时间:2021年12月24日 10:59:50   作者:justry_deng  
这篇文章主要介绍了log4j2使用filter过滤日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

背景说明

log4j2作为log4j的升级版本,其性能自然是大大优于log4j的,同时其其性能又是优于logback的,甚至在部分领域,log4j2的性能远超logback几个数量级。   

log4j2的亮点主要在这几个方法进行体现:异步、并发、配置优化、插件机制等。本文初步学习基于log4j2插件机制的Filter。

Filter.Result的三种过滤结果

log4j2走过滤器的逻辑后,会返回对应的过滤Result结果,以控制是否记录日志、怎样记录日志。过滤器的结果有:

在这里插入图片描述

  • ACCEPT:(不需要再走后面的过滤器了,)需要记录当前日志。
  • NEUTRAL:需不需要记录当前日志,由后续过滤器决定。若所有过滤器返回的结果都是NEUTRAL,那么需要记录日志。
  • DENY:(不需要再走后面的过滤器了,)不需要记录当前日志。

提示:log4j2的此机制与logback是一样的。

log4j2提供的过滤器(功能简述)

提示: 下图基于log4j2.13.3。

在这里插入图片描述

过滤器 说明 是否常用
StringMatchFilter 如果格式化后(即:最终)的日志信息中包含${指定的字符串},则onMatch,否则onMismatch 即: msg.contains(this.text) ? onMatch : onMismatch;
LevelRangeFilter 若${maxLevel} <= 日志级别 <= ${minLevel}, 则onMatch,否则onMismatch 如: 即为只记录日志info及warn级别的日志。
RegexFilter 如果日志信息匹配${指定的正则表达式},则onMatch,否则onMismatch 注:可通过useRawMsg属性来控制这个日志信息是格式化处理后(即:最终)的日志信息,还是格式化处理前(即:代码中输入)的日志信息。
ThresholdFilter 若日志级别 >= ${指定的日志级别}, 则onMatch,否则onMismatch
LevelMatchFilter 如果日志级别等于${指定的日志级别},则onMatch,否则onMismatch
ThreadContextMapFilter 通过context(可以理解为一个Map)中对应的key-value值进行过滤 注:上下文默认是ThreadContext,也可以自定义使用ContextDataInjectorFactory配置ContextDataInjector来指定。
DynamicThresholdFilter 若上下文中包含指定的key,则触发DynamicThresholdFilter生效;若该key对应的value值等于任意一个我们指定的值,那么针对本条日志,可记录日志级别的约束下限调整为指定的级别 注:上下文默认是ThreadContext,也可以自定义使用ContextDataInjectorFactory配置ContextDataInjector来指定。 示例说明:<DynamicThresholdFilter key="loginRole" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"><KeyValuePair key="admin" value="DEBUG"/><KeyValuePair key="user" value="warn"/></DynamicThresholdFilter>配置,有以下情况: 情况一:存在键loginRole,假设从上下文(可以理解为一个Map)中取出来的对应的值为user,那么此时,对于日志级别大于等于warn的日志,会走onMatch;其它的日志级别走onMismatch。 情况二:存在键loginRole,假设从context(可以理解为一个Map)中取出来的对应的值为admin,那么此时,对于日志级别大于等于debug的日志,会走onMatch;其它的日志级别走onMismatch。 情况三:【上下文(可以理解为一个Map)中,不存在键loginRole】或【存在键loginRole,但从日志上下文中取出来的值(假设)为abc, 没有对应的KeyValuePair配置】,那么此时<DynamicThresholdFilter key="userRole" defaultThreshold="AAA" onMatch="BBB" onMismatch="CCC">等价于<LevelMatchFilter level="AAA" onMatch="BBB" onMismatch="CCC">。
CompositeFilter 组合过滤器,即:按照xml配置中的配置,一个过滤器一个过滤器的走,如果在这过程中,任意一个过滤器ACCEPT或DENY了,那么就不会往后走了,直接返回对应的结果。
TimeFilter 如果记录日志时的当前时间落在每天指定的时间范围[start, end]内,则onMatch,否则onMismatch 如:<TimeFilter start="05:00:00" end="05:30:00" onMatch="ACCEPT" onMismatch="DENY"/>。
ScriptFilter 是否匹配取决于指定的脚本返回值是否为true
DenyAllFilter This filter causes all logging events to be dropped
BurstFilter 对低于或等于${指定日志级别}的日志,进行限流控制
NoMarkerFilter 如果从对应事件对象获取(LogEvent#getMarker)到的marker为null, 则onMatch,否则onMismatch
MarkerFilter 如果从对应事件对象获取(LogEvent#getMarker)到的marker的name值为等于${指定的值}, 则onMatch,否则onMismatch
MapFilter The MapFilter allows filtering against data elements that are in a MapMessage. 注:需要使用org.apache.logging.log4j.Logger进行记录,且记录org.apache.logging.log4j.message.MapMessage日志,才会生效。 注:因为暂时不兼容Slf4j这里不多作说明
StructuredDataFilter The StructuredDataFilter is a MapFilter that also allows filtering on the event id, type and message. 注:需要使用org.apache.logging.log4j.Logger进行记录,且记录org.apache.logging.log4j.core.filter.StructuredDataFilter日志,才会生效。 注:因为暂时不兼容Slf4j这里不多作说明

Filter的作用范围

log4j2在处理日志时,各个Filter会组成过滤链,越靠前的Filter越先过滤,自然影响范围就越大。在log4j2的xml配置文件中,Filter可以配置在四个位置,由全局到局部依次是 Context-wide、 Logger和Appender、AppenderReference, 图示说明:

在这里插入图片描述

常用过滤器使用示例(文字版代码见文末链接)

StringMatchFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

LevelRangeFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

RegexFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

ThresholdFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

LevelMatchFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

ThreadContextMapFilter

示例一: log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

示例二: log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

DynamicThresholdFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

CompositeFilter

log4j2.xml配置

在这里插入图片描述

测试代码与输出日志

在这里插入图片描述

自定义Filter

一般来说,log4j2官方提供的过滤器就足够我们使用了,如果非要自定义过滤器,可以继承AbstractFilter,或者直接实现Filter,这里不再演示自定义过滤器。

更多可见:

https://logging.apache.org/log4j/2.x/manual/filters.html

http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/filter/

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring IOC与DI核心重点分析

    Spring IOC与DI核心重点分析

    IOC也是Spring的核心之一了,之前学的时候是采用xml配置文件的方式去实现的,后来其中也多少穿插了几个注解,但是没有说完全采用注解实现。那么这篇文章就和大家分享一下,全部采用注解来实现IOC + DI
    2022-10-10
  • 使用java数组 封装自己的数组操作示例

    使用java数组 封装自己的数组操作示例

    这篇文章主要介绍了使用java数组 封装自己的数组操作,结合实例形式分析了java数组索引、遍历等相关封装操作技巧与注意事项,需要的朋友可以参考下
    2020-03-03
  • JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    这篇文章主要介绍了Java Spring事务使用及验证过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • SpringMVC实现文件上传与下载

    SpringMVC实现文件上传与下载

    这篇文章主要为大家详细介绍了SpringMVC实现文件上传与下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Idea打War包流程图文教程

    Idea打War包流程图文教程

    这篇文章主要给大家介绍了关于Idea打War包流程的相关资料,IDEA导出war包的方式与MyEclipse有一点不同,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • JDK17在Windows安装及环境变量配置超详细的教程

    JDK17在Windows安装及环境变量配置超详细的教程

    这篇文章主要介绍了JDK17在Windows安装及环境变量配置超详细的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • java使用jna调用c#中dll的方法详解

    java使用jna调用c#中dll的方法详解

    前一段时间接了个项目,需要用到第三方提供的C#编写的dll,本身项目是java语言,所以便有了下面这篇文章,本文给大家介绍了关于java中如何使用jna调用c#中dll的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • SpringBoot如何优雅的处理全局异常

    SpringBoot如何优雅的处理全局异常

    这篇文章主要给大家介绍了关于SpringBoot如何优雅的处理全局异常的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Springcloud seata nacos环境搭建过程图解

    Springcloud seata nacos环境搭建过程图解

    这篇文章主要介绍了Springcloud seata nacos环境搭建过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java使用Jsoup连接网站超时的解决方法

    java使用Jsoup连接网站超时的解决方法

    jsoup是一个非常好的解析网页的包,用java开发的,提供了类似DOM,CSS选择器的方式来查找和提取文档中的内容,提取文档内容时会出现超时的情况,解决方法可看下文
    2013-11-11

最新评论