PM2入坑实战及日志切割

·  阅读 4475

引言

以前没怎么接触过pm2,因为最近公司项目中遇到pm2日志过大的问题,所以直接解决时系统的了解了下pm2的知识

阅读这篇文章能学会什么?

  • node项目如何接入pm2
  • 查看pm2的日志管理,了解日志管理规则
  • 如何做pm2的日志切割

PM2接入项目

step1. 全局安装pm2

npm i pm2 -g
复制代码

step2. pm2启动node项目

// pm2可以启动js sh py等各种脚本
pm2 start app.js | bashscript.sh | python-app.py | binary-file
复制代码

demo实现node项目接入PM2

// step1. npm init
<!--
    packake.json
    没用的代码这里去掉了
-->
{
  "name": "pm2",
  "scripts": {
    "start": "pm2 start index.js"
  }
}
复制代码
<!--index.js-->
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx, next) => {
    ctx.body = 'HELLO PM2!'
    await next()
})
app.listen(3000)
复制代码

执行npm start,打开localhost:3000,可以发现服务器运行成功了

强制关闭node进程后,pm2干了啥?

  • 启动pm2之初,查看进程,可以发现多了个ID为67065的进程

  • ok,关闭67065
  • 关闭67065之后发现又多了个67077,然后请求localhost:3000,还是可以HELLO PM2,那么再关闭67077
  • 从上图可以看到,关闭67077之后又多了个67105

这说明当进程被退出之后,pm2会自动重开进程,以保证应用的稳定

PM2的命令行

pm2 start <app_name> 启动项目

pm2 list | pm2 ls | pm2 status 查看pm2管理项目列表

pm2 stop <app_name> 停止项目(项目虽然停止了,但是还是会在pm2列表里,可以使用pm2 list查看)

pm2 delete <app_name> 删除项目(删除项目会从列表中删除,pm2 list不再能看到)

pm2 reload <app_name> 重载项目

reload:可以做到0秒宕机来加载新代码,生产环境多用reload来完成代码更新

pm2 restart <app_name> 重启项目

pm2 logs
pm2 logs --lines 5 查看最后5行日志

pm2 flush 清空日志

pm2 monit 查看实时的dashboard 监控每个 node 进程的 cpu 和内存使用情况

pm2 update

类似watch的功能,更新index.js之后,刷新网页没有改变,然后pm2 update,页面更新了

pm2配置:

--watch 可以监视node文件并重启应用 类似nodemon的工具
--ignore-watch="node_modules"
--name 重命名 pm2 start index.js --name app 重命名为app
--log <log_path> 日志地址
--time log with time

--restart-delay 3 单位ms 自动重启时的delay --no-autorestart 不要自动重启服务

pm2修改导出日志地址

<!--pm2.json-->
<!--pm2 init 可以创建一个配置文件-->
{
  "name": "app",
  "script": "./index.js",
  "cwd": "./",
  "instances": 1,
  "autorestart": true,
  "watch": false,
  "max_memory_restart": "1G",
  "out_file": "pm2-logs/log.log",
  "error_file": "pm2-logs/error.log"
}

pm2 start pm2.json
复制代码

会在当前目录下新建一个pm2-logs文件夹,下面有log.log和error.log的日志文件

pm2-logrotate 模块使用

这里介绍下pm2的日志切割模块pm2-logrotate的使用

step 1. 安装pm2-logrotate模块
pm2 install pm2-logrotate
复制代码
step 2. 设置pm2-logrotate的切割规则

1. 设置文件大小为500K,大于等于开始切割
pm2 set pm2-logrotate:max_size 500K

2.设置文件切割的监控间,监控间隔比较大,可能会使切割出的文件大小和max_size有出入
pm2 set pm2-logrotate:workerInterval 1

3. 设置文件最多多少个,超过则删除
pm2 set pm2-logrotate:retain 7
复制代码

pm2-logrotate使用过程中遇到的坑

在使用过程中有一次刚好在设置pm2 set pm2-logrotate:workInterval 1时,服务器的日志文件已经达到设置的10G上线,然后就提示如下错误:

就算是执行pm2 uninstall pm2-logrotate时,也会提示这个Unexpected end of JSON input

当时我的猜测是在写入溢出时设置workInterval,把pm2的文件给搞坏了,但是哪个文件搞坏了没头绪,然后平时因为我电脑只有125G的问题,有个生活教训是当mac提示磁盘不足时如果还在编辑文件,当前文件会被清空

根据这个经验,再去思考当pm2 set pm2-logrotate:workInterval时,应该会去修改pm2的配置文件,那么就去搜索这个配置文件

其实在.pm2的根目录下有个module的配置文件module_conf.json,如下图所示:

检查发现,当前的module_config.json被清空了,所以需要对它重新做下配置

这篇文章介绍了pm2的简单运用,后续再介绍深入的使用

分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改