java 单机接口限流处理方案
928
2022-09-07
log4j2使用filter过滤日志方式
目录背景说明Filter.Result的三种过滤结果log4j2提供的过滤器(功能简述)Filter的作用范围常用过滤器使用示例(文字版代码见文末链接)StringMatchFilterLevelRangeFilterRegexFilterThresholdFilterLevelMatchFilterThreadContextMapFilterDynamicThresholdFilterCompositeFilter自定义Filter
背景说明
log4j2作为log4j的升级版本,其性能自然是大大优于log4j的,同时其其性能又是优于logback的,甚至在部分领域,log4j2的性能远超logback几个数量级。
log4j2的亮点主要在这几个方法进行体现:异步、并发、配置优化、插件机制等。本文初步学习基于log4j2插件机制的FiltpKGRPmQgWer。
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来指定。 示例说明:
是
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, 图示说明:
常用过滤器使用示例(文字版代码见文末链接)
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/
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~