pm2线上问题处理记录
背景
线上机器存在两个 pm2 部署的系统服务, 由于 pm2 默认输出到pm2-out.log
文件中, 系统运行了一年多这个文件已经几十 G 了, 查询日志定位问题时 grep 速度极慢…所以想法是修改输出日志文件到新文件中, 并对其做日志切割.
具体实现
更换日志输出文件
pm2 默认通过ecosystem.config.json
进行各种配置, 这里对输出的文件进行修改
1 |
|
需要杀死当前服务的进程
pm2 delete <id|name>
不能只是stop
, 更新的配置不会生效, 然后
pm2 start ecosystem.config.js
logs 下新文件成功生成了
日志切割
这里使用 pm2 提供的日志切割插件pm2-logrotate
, 可以设置默认的日志大小阈值, 日志文件日期格式, 进程轮询日志大小时间间隔, cron 定时任务等.
安装: pm2 install pm2-logrotate
修改配置: pm2 set pm2-logrotate:<paramName> <value>
查看插件配置: pm2 conf pm2-logrotate
以下为我设置的pm2-logrotate
配置:
线上处理
在开发机 devServer 上验证时畅通无阻, 但在线上机器测试时又是一番波折.
- Q: 线上机器执行
pm2 list
时没有输出
- A: 最开始部署服务以及发版本重启服务时都是以 root 权限执行的
pm2 start
, 这导致申请普通权限的我并没有查看 root 用户进程的权限; 在申请 root 权限并执行sudo su
后可以正常输出
- Q: 线上机器 pm2 部署了两个服务, 但是
pm2 list
只输出一个 - A: 查看两个服务的重启脚本文件后, 发现
PM2_HOME
环境变量, 用于在同一台机器上生成多个 pm2 实例, 类似于命名空间,不同实例之间相互隔离, 默认使用相同的PM2_HOME
设置PM2_HOME
启动:
pm2 start PM2_HOME=$(pwd)/_pm2
或先暴露环境变量, 然后再启动:
1 |
|
在不同PM2_HOME
下都能够看到 pm2 对应的服务了
参考资料 no.4 深入介绍了 copytruncate 机制的 pm2-logrotate 和 sign 机制的 egg-logrotator, 有兴趣的可以看看~
reference
pm2线上问题处理记录
https://mariana-yui.github.io/2022/09/27/2022-09-27-pm2-online-issue-record/