You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React应用npm build+pm2部署后,如何用pm2-logrotate存日志到指定目录?

问题分析与解决方案

核心问题

你看到两个my-app进程是因为启动脚本先后启动了两个同名PM2进程:

  1. 通过pm2 start ecosystem.config.js启动的是CRA的build.js脚本——这只是一次性构建任务,不需要PM2守护;
  2. 又通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:44:59