磁盘告警时,把 /var/log 下所有文件清空,可能暂时省空间,却也会丢掉解释故障和安全事件所需的证据。先弄清楚是什么在增长,再决定哪些内容允许处理。
先区分块空间与 inode
在有权限的目标主机上,可先检查相应文件系统:
df -h /var/log
df -i /var/log
du -x -h --max-depth=1 /var/log
这是 GNU/Linux 风格的只读检查示例。df 看文件系统使用情况,df -i 看 inode,du 统计能遍历到的文件占用;权限、挂载点、保留空间和快照都可能让结果不同。
不要只看某个大文件名就假设它一定是可删日志。应用文本日志、systemd journal、数据库事务日志、认证和登录记录,需要不同的管理方式。
删除文件名,不一定立即释放空间
写日志的进程可能继续持有已删除文件的描述符。此时目录里看不到文件,文件占用却要等最后一个打开引用关闭后才可回收。Linux unlink 语义
安装了 lsof 且权限允许时,可辅助检查没有目录链接却仍打开的文件:
lsof +L1
它提供排查线索,不是“输出的都可以杀进程”。确认写入者后,应按服务支持的重新打开日志、平滑重载或受控重启机制处理;直接删除路径可能让新日志继续写到看不见的旧文件中。
文本日志应有明确轮转策略
logrotate 可按配置轮转、压缩和保留归档。下面仅展示一个自建样本日志的策略结构,不是可直接套用的生产配置:
/srv/demo/log/app.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
}
daily 表达日轮转条件,仍需要相应调度实际运行;rotate 7 表示保留相应数量的轮转文件,不是保证每份日志恰好保留七个自然日。
还必须按服务文档配套处理日志重新打开、文件创建权限和所属用户。仅重命名文件而不让写入者重新打开,可能继续写旧归档。copytruncate 虽可用于无法重新打开的场景,但复制与截断之间存在丢日志窗口,不承诺无损。logrotate 手册
先查看配置,再安排受控变更
对可信且已审查的配置,可以使用调试模式查看计划:
logrotate --debug /etc/logrotate.conf
官方说明该模式不更改日志和状态文件;仍须保护输出中的路径等信息,并按本机版本核对。不要将 —force 当成只读检查,它会触发实际轮转。
已有日志保留要求、事件取证需求和备份范围应事先明确。journal 使用相应工具管理,数据库日志依照数据库机制处理;不对二进制登录记录和普通文本文件套同一段截断脚本。
最后检查轮转任务是否按时执行、应用是否继续写新文件,以及磁盘增长是否恢复可控。一次清空不能替代容量、保留和失败告警设计。