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

使用PM2运行Next.js集群模式无法获取请求日志求助

解决PM2无法捕获Next.js请求及自定义日志的问题

核心问题定位

你的启动命令执行的是npm start,而package.json中start脚本是next start "--port=3001",这意味着PM2启动的是Next.js官方默认服务器,完全没有运行你写的server.js自定义服务器,所以里面的请求日志和启动逻辑根本不会执行,这是看不到目标日志的主要原因。

修复步骤

1. 调整PM2启动命令,直接运行自定义server.js

替换原启动命令,直接指定server.js作为入口,同时配置集群模式:

# 集群模式:按CPU核心数自动创建实例
pm2 start server.js -i max --name dev-public-banger --env PORT_PUBLIC_BANGER=3001 --merge-logs

# 单实例集群模式(仅1个进程):
pm2 start server.js -i 1 --name dev-public-banger --env PORT_PUBLIC_BANGER=3001 --merge-logs
  • -i max:自动匹配CPU核心数创建集群实例,满足你的集群模式需求
  • --env:传递端口环境变量,对应server.js中PORT_PUBLIC_BANGER的配置
  • 直接启动server.js,确保自定义Express服务器和日志逻辑被执行

2. 确保日志输出被PM2捕获

loglevel默认输出到console,但可显式绑定到process.stdout/process.stderr,避免日志被拦截。修改server.js的日志初始化代码:

const rootLogger = require('loglevel');

// 重写loglevel方法工厂,强制输出到标准流
rootLogger.methodFactory = (methodName, level, loggerName) => {
  const logMethod = rootLogger.methodFactory(methodName, level, loggerName);
  return (...args) => {
    logMethod(...args);
    // 根据日志级别输出到对应流
    const stream = level <= rootLogger.levels.WARN ? process.stdout : process.stderr;
    stream.write(`[${new Date().toISOString()}] [${loggerName}] ${args.join(' ')}\n`);
  };
};

rootLogger.setLevel(rootLogger.levels.DEBUG);
const defaultLogger = rootLogger.getLogger('internal');

3. 转发Next.js内置日志到自定义logger

确保Next.js的请求、错误日志也能被PM2捕获,修改Next.js初始化代码:

const app = next({ 
  dev, 
  preserveLog: true,
  // 将Next.js内置日志转发到自定义logger
  logger: {
    info: (...args) => defaultLogger.log('Next.js Info:', ...args),
    warn: (...args) => defaultLogger.warn('Next.js Warn:', ...args),
    error: (...args) => defaultLogger.error('Next.js Error:', ...args),
  }
});

4. 使用PM2配置文件(可选,更易管理)

创建ecosystem.config.js统一管理集群、日志、环境变量:

module.exports = {
  apps: [
    {
      name: 'dev-public-banger',
      script: './server.js',
      instances: 'max', // 可改为具体数字如2
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'development',
        PORT_PUBLIC_BANGER: 3001
      },
      merge_logs: true,
      out_file: './logs/app.log', // 自定义日志路径
      error_file: './logs/error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss'
    }
  ]
};

启动命令简化为:

pm2 start ecosystem.config.js

5. 验证日志输出

启动后执行以下命令查看实时日志:

pm2 logs dev-public-banger

发送请求到服务(如http://localhost:3001),检查是否能看到REQ标记的请求日志及Next.js相关日志。若仍有问题:

  • 重启PM2:pm2 delete dev-public-banger && pm2 start ...
  • 检查日志目录权限,确保PM2可写入
  • 直接查看配置的日志文件,确认是否有内容

内容的提问来源于stack exchange,提问作者ag7-alexis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:52:50