压测时每秒 8000 条日志,事后统计少了两成,logback 状态里 discarded 计数 15 万,业务关键的错误行也不见了。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,AsyncAppender 默认队列 256,满了按 discardingThreshold 丢弃低级别事件,配置里没改。队列消费速度跟不上生产速度,ERROR 之外的日志先被扔掉。
「异步日志丢失」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。改完顺手把文档补一句,省得下次自己重新推一遍。
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <queueSize>8192</queueSize> <discardingThreshold>0</discardingThreshold> <neverBlock>false</neverBlock> </appender>
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,把队列容量调到几千 按峰值日志量估;discardingThreshold 设 0 关闭丢弃;队列满时改成阻塞 宁可慢也不丢;把 discarded 计数接进监控 非 0 就告警。
最后用这个标准收尾,压测后 discarded 计数为 0 日志条数和业务计数一致。
