日志一天涨 20G:从定位来源到轮转配置的完整处理
磁盘告警最常见的原因就是日志。它涨得快、删得容易,所以很多人直接清空——然后第二天又满了。
日志暴涨通常有三种根因:调试级别忘关、错误循环刷屏、访问量突增。三者的处理方式完全不同。
先说结论
先定位写入源,再限流,最后做轮转。 清空只能买到几小时。
- du 定位目录 → lsof 找写入进程
- tail -f 看内容判断是调试输出还是错误刷屏
- 应用层调日志级别或加采样
- logrotate 配 size + rotate + compress
- journald 设 SystemMaxUse
先把问题说清楚
错误循环最常见:一个连接失败重试的日志,每秒写几百条,一小时就是几个 G。
访问日志暴涨则要看是不是被扫或被打,日志里会出现大量同 IP 的 404/400。
具体怎么做
按顺序执行,每步都验证完再进下一步:
- du -sh /var/log/* | sort -h 找大户,再进子目录下钻
- lsof /var/log/xxx.log 找出写入进程
- tail -n 200 看内容:调试信息 / 重试错误 / 异常请求
- 应用侧调级别(info→warn)或对重复错误做限流
- 配 logrotate:daily、size 100M、rotate 7、compress、copytruncate 或 postrotate 重开句柄
参数与成本对照
把关键数值摊开,方便判断该选哪条路:
| 来源 | 典型特征 | 处理方式 |
|---|---|---|
| 应用调试日志 | 同一请求多行 debug | 调级别,别只删 |
| 错误重试 | 每秒固定频率重复 | 修根因 + 限流 |
| 访问日志 | 大量 404/400 同 IP | 上 WAF/限速 |
| journald | system.journal 巨大 | SystemMaxUse=500M |

几个容易踩的坑
下面这些是最常见的错误做法:
- rm 掉正在写的日志:句柄不释放,空间不回收
- logrotate 不配 postrotate:进程还写旧句柄
- 把 rotate 设成 0:等于每次都删,出问题没日志可查
- 只清不治:几小时后原样复现
最后补两句
日志策略的目标不是「让小」,而是「出问题时查得到,平时不占盘」。这两条同时满足才算配好。
工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。
评论 (3)
照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。
比「一键脚本」有用多了,知道为什么比知道怎么做重要。
补充一句:不同版本行为会变,动手前先确认自己的版本号。
发表评论