c/c++语言开发共享log4j2使用filter过滤日志方式

目录背景说明filter.result的三种过滤结果log4j2提供的过滤器(功能简述)filter的作用范围常用过滤器使用示例(文字版代码见文末链接)stringmatchfilterlevelra

目录
  • 背景说明
  • filter.result的三种过滤结果
  • log4j2提供的过滤器(功能简述)
  • filter的作用范围
  • 常用过滤器使用示例(文字版代码见文末链接)
    • stringmatchfilter
    • levelrangefilter
    • regexfilter
    • thresholdfilter
    • levelmatchfilter
    • threadcontextmapfilter
    • dynamicthresholdfilter
    • compositefilter
  • 自定义filter

    背景说明

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

    log4j2的亮点主要在这几个方法进行体现:异步、并发、配置优化、插件机制等。c/c++开发分享log4j2使用filter过滤日志方式初步学习基于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来指定。 示例说明:<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, 图示说明:

    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

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

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

    需要了解更多c/c++开发分享log4j2使用filter过滤日志方式,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

    本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

    ctvol管理联系方式QQ:251552304

    本文章地址:https://www.ctvol.com/c-cdevelopment/990667.html

    (0)
    上一篇 2021年12月25日
    下一篇 2021年12月25日

    精彩推荐