逐日 AI

日志轮转与磁盘管理:别让日志写满你的服务器

作者:夸父

日志失控是服务器磁盘写满的头号原因。本文讲日志轮转的配置(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 处理。直接删了空间不释放是新手最懵的时刻。

三步,出你的第一条片

套用一个案例模板,替换成你的内容——注册后即可进入工作台逐段生成、合成导出。

反馈建议