文章 573
评论 5
浏览 224986
日志异步落盘阻塞优化:Logback AsyncAppender 队列满丢弃日志?CallerRuns 策略保关键日志!

日志异步落盘阻塞优化:Logback AsyncAppender 队列满丢弃日志?CallerRuns 策略保关键日志!

去年双十一,隔壁组出了个事故。交易系统在高并发的时候偶发超时,运维翻日志找原因,结果发现那个时间段的 ERROR 日志全是空的。排查了一圈才搞明白——Logback 设了 AsyncAppender,队列满了之后,新来的日志直接被丢弃了。问题日志没留下来,复盘都无从下手。 异步日志本来是提升性能的好东西,但如果没搞懂它"队列满了怎么办",关键时刻它会把你最需要的那条日志扔掉。 今天聊聊怎么用好 Logback 的异步日志——既不让日志拖慢业务线程,也不让关键日志在队列溢出时被丢弃。 同步日志慢在哪 先说清楚为什么需要异步。一次常规的日志写入,背后是好几步操作: 业务线程调用 log.info() │ ├─ 格式化:把参数拼进日志模板 → "订单 12345 支付成功" ├─ 编码:转成字节数组(UTF-8) ├─ 写磁盘:fsync 刷到文件 └─ 返回,业务线程继续 其中"写磁盘"这一步最慢。固态硬盘一次随机写入大约 0.1ms,机械硬盘可能到几毫秒。如果业务代码里日志打得很密,每次 log.info() 业务线程都要等磁盘写完才能继续——高并发下这个等待会非常可观。 异步日志....

服务端开发博客:后端架构、高并发、性能优化与微服务实战教程