优秀的编程知识分享平台

网站首页 > 技术文章 正文

程序员们一定要注意避免重复记录日志撑爆ELK而被辞退

nanyue 2024-09-01 20:38:34 技术文章 9 ℃

日志重复记录不但给查看日志和统计工作带来不必要的麻烦,还会增加磁盘和日志收集系统的负担。

logger配置继承关系导致日志重复记录

  • 定义一个方法实现debug、info、warn和error四种日志的记录
  • Logback配置
  • 配置看没啥问题,执行方法后出现日志重复记录
  • 分析
    CONSOLE这个Appender同时挂载到了俩Logger,定义的
    <logger><root>,由于定义的<logger>继承自<root>,所以同一条日志既会通过logger记录,也会发送到root记录,因此应用package下日志出现重复记录。

如此配置的初衷是啥呢?
内心是想实现自定义logger配置,让应用内的日志暂时开启DEBUG级别日志记录。其实,这无需重复挂载Appender,去掉
<logger>下挂载的Appender即可:

<logger name="org.javaedge.time.commonmistakes.logging" level="DEBUG"/>

若自定义<logger>需把日志输出到不同Appender:
比如

  • 应用日志输出到文件app.log
  • 其他框架日志输出到控制台

可设置<logger>additivity属性为false,这就不会继承<root>的Appender

错误配置LevelFilter造成日志重复

  • 在记录日志到控制台的同时,把日志记录按照不同级别记录到俩文件
  • 执行结果
  • info.log 文件包含INFO、WARN和ERROR三级日志,不符预期
  • error.log包含WARN和ERROR级别日志,导致日志重复收集
  • 事故问责
    一些公司使用自动化ELK方案收集日志,日志会同时输出到控制台和文件,开发人员在本地测试不会关心文件中记录的日志,而在测试和生产环境又因为开发人员没有服务器访问权限,所以原始日志文件中的重复问题难以发现。

日志到底为何重复呢?

ThresholdFilter源码解析

  • 日志级别 ≥ 配置级别 返回NEUTRAL,继续调用过滤器链上的下个过滤器
  • 否则返回DENY,直接拒绝记录日志

该案例我们将 ThresholdFilterWARN,因此可记录WARNERROR级日志。

LevelFilter

用于比较日志级别,然后进行相应处理。

  • 若匹配就调用onMatch定义的处理方式:默认交给下一个过滤器处理(AbstractMatcherFilter基类中定义的默认值)
  • 否则调用onMismatch定义的处理方式:默认也是交给下一个过滤器


ThresholdFilter不同,LevelFilter仅配置level无法真正起作用

由于未配置onMatch和onMismatch属性,所以该过滤器失效,导致INFO以上级别日志都记录了。

修正

配置LevelFilter的onMatch属性为ACCEPT,表示接收INFO级别的日志;配置onMismatch属性为DENY,表示除了INFO级别都不记录:

如此,_info.log文件只会有INFO级日志,不会再出现日志重复。

Tags:

最近发表
标签列表