log4j2使用filter过滤日志方式

目录

  • 背景说明
  • Filter.Result的三种过滤结果
  • log4j2提供的过滤器(功能简述)
  • Filter的作用范围
  • 常用过滤器使用示例(文字版代码见文末链接)
    • StringMatchFilter
    • LevelRangeFilter
    • RegexFilter
    • ThresholdFilter
    • LevelMatchFilter
    • ThreadContextMapFilter
    • DynamicThresholdFilter
    • CompositeFilter
  • 自定义Filter

    背景说明 log4j2作为log4j的升级版本,其性能自然是大大优于log4j的,同时其其性能又是优于logback的,甚至在部分领域,log4j2的性能远超logback几个数量级。 ??
    log4j2的亮点主要在这几个方法进行体现:异步、并发、配置优化、插件机制等。本文初步学习基于log4j2插件机制的Filter。

    Filter.Result的三种过滤结果 log4j2走过滤器的逻辑后,会返回对应的过滤Result结果,以控制是否记录日志、怎样记录日志。过滤器的结果有:
    log4j2使用filter过滤日志方式
    文章图片

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

    log4j2提供的过滤器(功能简述) 提示: 下图基于log4j2.13.3。
    log4j2使用filter过滤日志方式
    文章图片

    过滤器 说明 是否常用
    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来指定。 示例说明:配置,有以下情况: 情况一:存在键loginRole,假设从上下文(可以理解为一个Map)中取出来的对应的值为user,那么此时,对于日志级别大于等于warn的日志,会走onMatch; 其它的日志级别走onMismatch。 情况二:存在键loginRole,假设从context(可以理解为一个Map)中取出来的对应的值为admin,那么此时,对于日志级别大于等于debug的日志,会走onMatch; 其它的日志级别走onMismatch。 情况三:【上下文(可以理解为一个Map)中,不存在键loginRole】或【存在键loginRole,但从日志上下文中取出来的值(假设)为abc, 没有对应的KeyValuePair配置】,那么此时等价于
    CompositeFilter 组合过滤器,即:按照xml配置中的配置,一个过滤器一个过滤器的走,如果在这过程中,任意一个过滤器ACCEPT或DENY了,那么就不会往后走了,直接返回对应的结果。
    TimeFilter 如果记录日志时的当前时间落在每天指定的时间范围[start, end]内,则onMatch,否则onMismatch 如:
    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, 图示说明:
    log4j2使用filter过滤日志方式
    文章图片


    常用过滤器使用示例(文字版代码见文末链接)
    StringMatchFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    LevelRangeFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    RegexFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    ThresholdFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    LevelMatchFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    ThreadContextMapFilter
    示例一: log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片

    示例二: log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    DynamicThresholdFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    CompositeFilter
    log4j2.xml配置
    log4j2使用filter过滤日志方式
    文章图片

    测试代码与输出日志
    log4j2使用filter过滤日志方式
    文章图片


    自定义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/
    【log4j2使用filter过滤日志方式】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

      推荐阅读