PM2 日志无限增?一套 pm2-logrotate 方案直接封印爆盘危机

105 阅读3分钟

最近在跑 Playwright 爬虫的时候,服务器的日志突然像开了外挂一样无限增长,差点把磁盘写满。查了半天我居然磁盘里查出来一个多 G 的 log


一、PM2 日志爆盘为什么会发生?

默认情况下,PM2 的日志机制:

  • out.log:记录 console.log 输出

  • error.log:记录异常信息

  • 特点

    • 永不自动清理

    • 永不压缩

    • 永不轮转

    • 文件可以无限增长

换句话说:

只要你不停地运行,日志就会一直涨,直到服务器“趴下”。

可以用这个命令看看你的日志大小:

ls -lh ~/.pm2/logs/

如果像我之前一样,单个日志几十兆甚至上百兆,说明你的服务器正在默默被日志“啃食”磁盘。


二、第一步:清理历史日志

先别慌,直接清掉旧日志:

rm -rf ~/.pm2/logs/*

注意:这是一次性清理,不影响 PM2 正常运行的进程。


三、根治方案:pm2-logrotate

安装 pm2-logrotate:

pm2 install pm2-logrotate

然后设置核心配置(生产环境可直接复制):

pm2 set pm2-logrotate:max_size 5M          # 日志超过 5M 自动切割
pm2 set pm2-logrotate:retain 3            # 最多保留 3 个历史日志
pm2 set pm2-logrotate:compress true       # 自动压缩旧日志
pm2 set pm2-logrotate:rotateInterval '1d' # 每天轮转一次
pm2 set pm2-logrotate:dateFormat 'YYYY-MM-DD_HH-mm-ss'
pm2 set pm2-logrotate:timezone 'Asia/Shanghai'
pm2 restart all

四、效果验证

查看配置是否生效:

pm2 conf pm2-logrotate

查看日志文件:

ls -lh ~/.pm2/logs/
pm2 logs

你会发现:

  • 日志按天生成
  • 超过 5M 自动切割
  • 历史日志自动压缩
  • 保留最近 3 个文件
  • 再也不用担心日志爆盘

五、pm2-logrotate 关键参数说明(10 项)

参数示例作用备注
max_size5M超过大小自动切割必须设置,否则无限写
retain3保留最近 3 个日志文件控制磁盘占用
compresstrue压缩旧日志节省空间
rotateInterval1d每天轮转一次日志量大必开
dateFormatYYYY-MM-DD_HH-mm-ss日志切割后的命名格式方便定位
workerInterval30每 30 秒检查日志默认即可
rotateModuletrue轮转模块日志用模块才需
timezoneAsia/Shanghai按本地时间切割避免国际时差
audittrue记录轮转行为运维追踪用
copyTruncatetrue保留 inode避免某些程序写入异常

六、Playwright 爬虫专属优化建议

Playwright 输出日志量大,尤其是大量 console.log 调试信息。

建议:

  1. 日志级别分离,只保留 error.log,减少无用噪声

  2. 定期清理或使用 pm2-logrotate 自动轮转

  3. 错误日志可加颜色或关键词过滤,快速定位异常

示例:只输出 error 级别日志

console.error('❌ 错误:', err.message)

七、总结

一句话总结:

PM2 日志如果不轮转,就像油箱漏油;pm2-logrotate 就是油箱盖,装了再也不用怕服务器爆盘。

💡 实战经验

  • Playwright + PM2 爬虫场景必备
  • max_size + retain + compress + rotateInterval 就够用
  • 日志可查、磁盘安全、排错高效