点击上方“JavaEdge”,关注公众号
java
因为日志配置繁杂,不少同窗喜欢直接cv其余项目或网上博客的配置文件,而不仔细研究每一个配置项。最多见的就是重复记录日志,这不但给查看和统计带来没必要要麻烦,还会增长磁盘和日志收集系统负担。数据库
下面看几个常见致使该错误的案例,你们引觉得戒,避免被辞退。服务器

1 logger配置继承关系错误微信

定义方法记录debug、info、warn、error四种日志:app
Logback配置框架
配置看没啥问题,但执行方法后明显记录重复了:测试
错因flex

CONSOLE这个Appender同时挂载到俩Logger,定义的<logger>
和<root>
,因为定义的<logger>
继承自<root>
,因此同一日志既会经过logger记录,也会发送到root记录,所以应用包下日志出现重复。ui

如此配置的初衷是啥?url

本想实现自定义logger配置,让应用内日志暂时开启DEBUG级别。
其实,这无需重复挂载Appender,去掉<logger>
下挂载的Appender便可
<logger name="org.javaedge.logging" level="DEBUG"/>
若自定义<logger>
需把日志输出到不一样Appender,好比
应用日志输出到文件app.log
其余框架日志输出到控制台
可设置<logger>
的additivity属性为false,就不会继承<root>
Appender

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级日志,不会再出现日志重复。
往期推荐

目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~
本文分享自微信公众号 - JavaEdge(Java-Edge)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。