最近在跑 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_size | 5M | 超过大小自动切割 | 必须设置,否则无限写 |
| retain | 3 | 保留最近 3 个日志文件 | 控制磁盘占用 |
| compress | true | 压缩旧日志 | 节省空间 |
| rotateInterval | 1d | 每天轮转一次 | 日志量大必开 |
| dateFormat | YYYY-MM-DD_HH-mm-ss | 日志切割后的命名格式 | 方便定位 |
| workerInterval | 30 | 每 30 秒检查日志 | 默认即可 |
| rotateModule | true | 轮转模块日志 | 用模块才需 |
| timezone | Asia/Shanghai | 按本地时间切割 | 避免国际时差 |
| audit | true | 记录轮转行为 | 运维追踪用 |
| copyTruncate | true | 保留 inode | 避免某些程序写入异常 |
六、Playwright 爬虫专属优化建议
Playwright 输出日志量大,尤其是大量 console.log 调试信息。
建议:
-
日志级别分离,只保留 error.log,减少无用噪声
-
定期清理或使用 pm2-logrotate 自动轮转
-
错误日志可加颜色或关键词过滤,快速定位异常
示例:只输出 error 级别日志
console.error('❌ 错误:', err.message)
七、总结
一句话总结:
PM2 日志如果不轮转,就像油箱漏油;pm2-logrotate 就是油箱盖,装了再也不用怕服务器爆盘。
💡 实战经验:
- Playwright + PM2 爬虫场景必备
- max_size + retain + compress + rotateInterval 就够用
- 日志可查、磁盘安全、排错高效