磁盘告警时,把 /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 使用相应工具管理,数据库日志依照数据库机制处理;不对二进制登录记录和普通文本文件套同一段截断脚本。

最后检查轮转任务是否按时执行、应用是否继续写新文件,以及磁盘增长是否恢复可控。一次清空不能替代容量、保留和失败告警设计。