pm2线上问题处理记录

背景

线上机器存在两个 pm2 部署的系统服务, 由于 pm2 默认输出到pm2-out.log文件中, 系统运行了一年多这个文件已经几十 G 了, 查询日志定位问题时 grep 速度极慢…所以想法是修改输出日志文件到新文件中, 并对其做日志切割.

具体实现

更换日志输出文件

pm2 默认通过ecosystem.config.json进行各种配置, 这里对输出的文件进行修改

1
2
3
4
5
6
7
8
9
10
module.exports = {
apps: [
{
// ...other configs
error_file: "../logs/pm2-error-new.log",
out_file: "../logs/pm2-out-new.log",
log_file: "../logs/pm2-app-new.log",
},
],
};

需要杀死当前服务的进程

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
2
3
export PM2_HOME=$(pwd)/_pm2
pm2 start
export PM2_HOME='' # 清除变量

在不同PM2_HOME下都能够看到 pm2 对应的服务了

参考资料 no.4 深入介绍了 copytruncate 机制的 pm2-logrotate 和 sign 机制的 egg-logrotator, 有兴趣的可以看看~

reference

  1. Multiple PM2 on the save server
  2. pm2 日志管理 pm2-logrotate 介绍
  3. pm2-logrotate
  4. Node.js 应用日志切割原理与踩坑实践

pm2线上问题处理记录
https://mariana-yui.github.io/2022/09/27/2022-09-27-pm2-online-issue-record/
作者
Mariana
发布于
2022年9月27日
许可协议