logback_doc_manual_07_filters
http://logback.qos.ch/manual/filters.html
logback-classic有两种filter:Regular filters和turbo filters,挂在appender上
Regular filters
只有一个decide()方法,返回DENY, NEUTRAL or ACCEPT
LevelFilter
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
ThresholdFilter
高于或等于指定日志级别的记录,会返回NEUTRAL
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
EvaluatorFilter
EventEvaluator的实现判断某个条件是否满足。
GEventEvaluator
接受groovy语法的布尔表达式作为判断条件,需要依赖Groovy运行时,表达式语句在配置的时候完成编译。
logback会自动将目标事件作为一个变量传进来,可以用“event”或者“e”来引用。
TRACE, DEBUG, INFO, WARN and ERROR这些级别也引入了,所以可以这样判断相等: "event.level == DEBUG" 。
其他比较符,大于小于,需要转换成int再比较。
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"><evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"><expression>e.level.toInt() >= WARN.toInt() && <!-- Stands for && in XML -->!(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )</expression></evaluator><OnMismatch>DENY</OnMismatch><OnMatch>NEUTRAL</OnMatch></filter>
JaninoEventEvaluator
使用java表达式,使用上比基于groovy的GEventEvaluator繁琐,但执行速度更快。
详情略。
Matchers
执行上面的过滤器时,可以调用String.matches()方法,但代价是每次需要重编译一个正则Pattern对象。
所以可以预先定义和编译一个,以便复用。
详情略。
TurboFilters
跟普通过滤器功能一样,但是:
1,TurboFilter是跟logging context关联的,而不是跟appender关联。作用域更大。不仅在指定appender使用时,而且在每次logging请求时都会被调用。
2,他们是在LoggingEvent对象创建之前被调用,过滤时不需要event实例做参数,所以性能更高(因为在event创建之前就已经执行过滤了)。
内置了一些TurboFilter:
MDCFilter 测试指定的值是否存在于MDC中
DynamicThresholdFilter 基于MDC的key和level来限流
MarkerFilter 测试指定的marker是否出现在请求中
DuplicateMessageFilter
自动过滤相同的消息。
使用简单的字符串比对——即使两个字符串基本相同,相差一两个字母:也会被认为不同。
仅比较raw字符串,用{}转义过的字符串不去比较。
可以通过AllowedRepetitions设置允许的重复上限,超过上限的会被抛弃。默认大小为5
需要通过一个内部cache来保存老的消息以便判断,可以通过CacheSize设置缓存大小,默认100.
在evaluator的expression里,将logging时间与项目启动时间对比,可以控制仅输出“项目启动后20秒内的某类型日志”——这个对于“确认某个定时任务在启动时是运行状态”很有用,例如:
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"><evaluator name="loggingTaskEval"><expression>logger.getName().contains("LoggingTask") &&message.contains("Howdydy-diddly-ho") &&(timeStamp - event.getStartTime()) >= 20000</expression></evaluator><OnMatch>DENY</OnMatch></filter>