React应用npm build+pm2部署后,如何用pm2-logrotate存日志到指定目录?
问题分析与解决方案
核心问题
你看到两个my-app进程是因为启动脚本先后启动了两个同名PM2进程:
- 通过
pm2 start ecosystem.config.js启动的是CRA的build.js脚本——这只是一次性构建任务,不需要PM2守护; - 又通过
pm2 --name "my-app" serve ...启动了静态文件服务进程。
实际对外提供服务的是第二个进程,但它没有配置日志路径;第一个构建进程的日志配置根本不会生效(构建完成后进程就会结束),这就是日志没写入指定目录的原因。
解决方案
1. 修正启动脚本(startup.sh)
移除不必要的PM2守护构建任务,直接用npm执行构建,同时将静态服务的配置统一放到ecosystem.config.js中,避免重复启动同名进程:
#!/bin/bash npm install # 安装并配置PM2及日志切割 npm install -g pm2 pm2 install pm2-logrotate pm2 set pm2-logrotate:rotateInterval "50 * * * *" pm2 set pm2-logrotate:dateFormat "YYYY-MM-DD_HH-mm-ss" # 修正原脚本的拼写错误:dateFormate → dateFormat # 确保日志目录存在,避免写入失败 mkdir -p /mylogs/my-app # 执行生产环境构建 npm run build # 通过ecosystem启动静态服务 pm2 start ecosystem.config.js # 配置开机自启并保存进程列表 pm2 save pm2 startup pm2 resurrect
2. 修正ecosystem.config.js
将配置改为启动serve静态服务(而非构建脚本),并指定日志路径:
module.exports = { apps: [ { name: "my-app", script: "serve", // 指定使用serve命令启动 args: "--single $STH_HOME/build -l 3000", // --single等价于--spa,指定构建目录和端口 instances: 1, watch: false, exec_mode: "fork", // 静态服务无需cluster模式,fork模式足够 restart_delay: 5000, out_file: "/mylogs/my-app/my-app.out", error_file: "/mylogs/my-app/my-app.err", log_date_format: "YYYY-MM-DD HH:mm Z", env: { NODE_ENV: "production" } } ] };
3. 验证配置
执行修正后的脚本后,用pm2 list检查只会有一个my-app进程;查看/mylogs/my-app/my-app.out和/mylogs/my-app/my-app.err,确认日志已正常写入。
额外注意事项
- 确认服务器上
$STH_HOME环境变量已正确设置,若未设置则直接替换为构建目录的绝对路径; pm2-logrotate会按照你设置的规则自动切割指定目录下的日志,无需额外在ecosystem中配置。
内容的提问来源于stack exchange,提问作者juls
相关产品推荐
相关产品推荐

