笔者语录: 我发现我喜欢捣鼓一些小玩意儿,虽然官网(见文末)写得很明白了,但是咱们对感兴趣的部分来敲一遍代码好吧。
过滤器简介:
-
简介
logback具有过滤器支持。logbcak允许给日志记录器appender配置一个或多个Filter(或者给整体配置一个或多个TurboFilter),来控制:当满足过滤器指定的条件时,才记录日志(或不满足条件时,拒绝记录日志)
。logback支持自定义过滤器,当然logback也自带了一些常用的过滤器,在绝大多数时候,自带的过滤器其实就够用了,一般是不需要自定义过滤器的。 -
logback提供的过滤器支持主要分两大类
-
ch.qos.logback.core.filter.
Filter
-
ch.qos.logback.classic.turbo.
TurboFilter
-
-
Filter与TurboFilter自带的几种常用过滤器
过滤器 | 来源 | 说明 | 相对常用 |
---|---|---|---|
LevelFilter | Filter | 对指定level的日志进行记录(或不记录),对不等于指定level的日志不记录(或进行记录) | 是 |
ThresholdFilter | Filter | 对大于或等于指定level的日志进行记录(或不记录),对小于指定level的日志不记录(或进行记录) 提示:info级别是大于debug的 | 是 |
EvaluatorFilter | Filter | 对满足指定表达式的日志进行记录(或不记录),对不满足指定表达式的日志不作记录(或进行记录) | 是 |
MDCFilter | TurboFilter | 若MDC域中存在指定的key-value,则进行记录,否者不作记录 | 是 |
DuplicateMessageFilter | TurboFilter | 根据配置不记录多余的重复的日志 | 是 |
DynamicThresholdFilter | TurboFilter | 动态版的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} | 是 |
MarkerFilter | TurboFilter | 针对带有指定标记的日志,进行记录(或不作记录) | 否 |
… | … | … | … |
-
若过滤器已经返回了需要记录,那么就一定会对该日志进行记录(不论当前日志的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