日志暴涨要先定位源头
日志目录增长过快通常不是均匀的,而是某个目录或某个文件在短时间内撑大。先按目录聚合大小排序,再筛出大文件,然后用文件句柄查询确认是哪个进程在持续写入。定位到源头之后,处理方式取决于它是系统日志还是应用日志。
删除不等于释放
一个普遍误解是删掉大日志文件就能腾出空间。如果文件仍被进程以句柄打开,直接删除只会让目录项消失,磁盘占用保持不变,直到进程关闭句柄或重启。正确做法是用日志轮转把文件切走并让服务重新打开新文件,紧急情况下用截断方式把文件内容清空。
基本信息
| 系统日志 | rsyslog 管理的目录加 systemd 日志 |
|---|---|
| 轮转工具 | logrotate,支持演练模式先看计划 |
| 句柄查询 | lsof 查看哪个进程在写某个文件 |
| systemd 日志 | journalctl 自带空间统计与收缩命令 |
典型使用场景
- 监控告警提示日志分区使用率快速上升
- 应用报错后频繁重试,日志量在几分钟内翻倍
- 巡检发现轮转产物堆积,历史日志没有按时清理
- 磁盘写满导致业务异常,需要紧急腾出空间
- 梳理日志保留策略,区分必须留存的审计日志与可丢弃的调试日志
定位
定位
du -x -h --max-depth=2 /var/log | sort -h | tail -15 # 按目录排序找大头
find /var/log -type f -size +200M -exec ls -lh {} + | head
journalctl --disk-usage # systemd 日志占用
lsof /var/log/messages 2>/dev/null | head # 谁在持续写这个文件
ls -lh /proc/<PID>/fd | grep -i log | head # 从进程侧反查打开的日志处理
处理
logrotate -d /etc/logrotate.conf | head -40 # 演练模式,先看轮转计划
logrotate -f /etc/logrotate.d/rsyslog # 应急强制切割指定配置
journalctl --vacuum-size=500M # 收缩 systemd 日志占用
# 应用日志:调高日志级别、按大小切割、归档到数据盘处理方式对照
| 方式 | 适用场景 | 注意点 |
|---|---|---|
| 日志轮转 | 常规治理,首选 | 确认服务支持重新打开文件 |
| 强制切割 | 应急腾空间 | 切割后复核轮转配置是否真正生效 |
| 内容截断 | 文件被占用且不能中断服务 | 仅清空内容,需评估审计留存要求 |
| 收缩 systemd 日志 | 系统日志占用大 | 不要手工删除日志目录 |
| 直接删除 | 不推荐 | 句柄仍打开时空间不会释放 |
直接删除正在写入的日志文件通常不会释放空间,因为进程句柄仍然有效。优先用日志轮转处理,应急截断前确认该日志是否属于必须留存的审计范围。