场景:监控警报显示 /var/log 磁盘使用率超过 90%。应用程序日志写入失败,关键服务开始崩溃。这是常见的生产事件,需要立即但谨慎的处理。
症状: - df -h 显示 /var/log 使用率为 100%。 - 应用程序错误:日志中出现“设备上没有剩余空间”。 - Logrotate 因磁盘满而失败。 - rsyslog 或 journald 等服务停止运行。
诊断:
1. 检查磁盘使用情况:df -h /var/log
2. 找出大文件:du -sh /var/log/* | sort -rh | head -10
3. 检查已删除但仍在打开的文件:lsof | grep '(deleted)'——这些文件仍占用空间,直到文件描述符关闭。
4. 检查 logrotate 状态:cat /var/lib/logrotate/status
5. 对于 systemd 日志:journalctl --disk-usage
命令与恢复步骤:
1. 安全截断未在写入的大日志文件。示例:truncate -s 0 /var/log/large-old.log
2. 对于打开的文件,使用 > /proc/<PID>/fd/<N>(极度谨慎,确保文件是日志)。
3. 强制 logrotate:logrotate -f /etc/logrotate.conf
4. 清理旧轮转日志:find /var/log -name '*.gz' -mtime +30 -delete
5. 如果使用 journald,减少保留量:journalctl --vacuum-size=500M
6. 重启日志服务:systemctl restart rsyslog 或 systemctl restart systemd-journald
风险控制: - 切勿删除仍在打开的文件;始终截断或在 logrotate 中使用 copytruncate。 - 清理前,尽可能快照文件系统。 - 先在非生产系统上测试 logrotate 配置。 - 清理后监控磁盘空间,确保不会快速再次填满。
回滚: - 如果服务在截断后失败,重启服务以重新打开日志。 - 如果 logrotate 配置错误,从备份恢复原始配置并重新运行 logrotate。
验证:
- 检查磁盘使用情况:df -h /var/log
- 验证服务健康:systemctl status <service> 针对受影响的服务。
- 确认日志写入:tail -f /var/log/syslog
何时提交 OpsGlobal 工单: - 如果根本原因不明确(例如,日志填充速度超出预期)。 - 如果磁盘空间耗尽发生在非日志分区。 - 如果需协助调整 logrotate 策略或设置监控阈值。 - 如果清理后事件再次发生,表明存在系统性问题。
适用场景
适合正在处理 DevOps、Linux, SRE, 故障排除, 日志管理 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
SRE 的分步指南,用于故障排除 /var/log 磁盘空间耗尽,包括安全日志清理、风险缓解和升级时机。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。