2 配置LevelFilter错误
记录日志到控制台时,将日志按级别记录到俩文件
执行结果
- info.log 文件包含INFO、WARN和ERROR三级日志,不符预期
- error.log包含WARN和ERROR俩级别日志,导致日志重复收集
事故问责
一些公司使用自动化ELK方案收集日志,日志会同时输出到控制台和文件,开发人员在本地测试不会关心文件中记录的日志,而在测试和生产环境又因为开发人员没有服务器访问权限,所以原始日志文件中的重复问题难以发现。
到底为何重复?
ThresholdFilter源码解析
- 当
日志级别 ≥ 配置级别返回NEUTRAL,继续调用过滤器链上的下个过滤器 - 否则返回DENY,直接拒绝记录日志
- 该案例我们将 ThresholdFilter 置 WARN,因此可记录WARN和ERROR级日志。
LevelFilter
用于比较日志级别,然后进行相应处理。
若匹配就调用onMatch定义的处理方式:默认交给下一个过滤器处理(AbstractMatcherFilter基类中定义的默认值)
否则调用onMismatch定义的处理方式:默认也是交给下一个过滤器
和ThresholdFilter不同,LevelFilter仅配置level无法真正起作用。
由于未配置onMatch和onMismatch属性,所以该过滤器失效,导致INFO以上级别日志都记录了。
修正
配置LevelFilter的onMatch属性为ACCEPT,表示接收INFO级别的日志;配置onMismatch属性为DENY,表示除了INFO级别都不记录:
如此,_info.log文件只会有INFO级日志,不会再出现日志重复。






