日志轮转与磁盘管理:别让日志写满你的服务器
作者:夸父
日志失控是服务器磁盘写满的头号原因。本文讲日志轮转的配置(pm2-logrotate/nginx/MySQL)与磁盘监控的自动化,附一套每周磁盘巡检脚本。
日志为什么会写满磁盘
三个失控源:pm2 的应用日志(node 服务的 stdout/stderr 无限追加,错误风暴时一小时几个 GB);nginx 访问日志(高流量站的 access.log 日增 GB 级);MySQL 的 binlog(binlog 保留期未配置时无限增长)。三个都有自动轮转的配置方案——配一次管终身。
pm2 日志轮转
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M # 单文件上限 50M
pm2 set pm2-logrotate:retain 14 # 保留 14 份
pm2 set pm2-logrotate:compress true # 压缩归档
配置后每个服务的日志按大小自动切割压缩——错误风暴时的磁盘保护伞。
nginx 与 MySQL 的轮转
nginx:logrotate 系统自带配置(/etc/logrotate.d/nginx),确认 daily + rotate 14 + compress 存在即可。MySQL binlog:SET GLOBAL binlog_expire_logs_seconds = 604800;(保留 7 天)——binlog 是增量备份的原料,保留期按备份策略匹配(见备份手册)。
磁盘巡检自动化
每周脚本(配合数据库维护的例行):
df -h | awk '$5+0 > 80 {print "磁盘告警:", $6, $5}'
du -sh /var/log /path/storage /var/lib/mysql 2>/dev/null
ls -lhS /root/.pm2/logs/ | head -5
三行输出贴进每周检查——磁盘水位 80% 告警、三大目录的体积趋势、pm2 日志的最大文件。
一条铁律
磁盘使用率 85% 是行动线,不是参考线——磁盘写满会导致 MySQL 拒写、日志丢失、应用崩溃的连锁反应。清理的顺序:日志归档 → 旧备份 → 临时文件 → 最后才是扩容。生产服务器的清理动作都先备份再删(见备份手册)。
常见问题
磁盘突然满了先查什么?
两条命令定位:du -sh /* | sort -h(哪个人目录最大)→ 逐层下钻;然后查三大惯犯——日志(/var/log 与 pm2 日志)、数据库数据目录、storage 素材目录。找到大头再决定清理或扩容。
日志可以直接删吗?
正在被进程写入的日志文件直接 rm 不会释放空间(句柄还在)——用 truncate -s 0 或让 logrotate 处理。直接删了空间不释放是新手最懵的时刻。


