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

Next.js 14 SSR生产环境日志不显示问题排查求助

Next.js 14 SSR生产环境日志失效排查方案

1. Next.js 14生产模式的日志默认限制

Next.js在npm run start的生产模式下,会默认抑制服务端组件里的console.log输出——这是框架的性能优化策略,非必要日志会被静默处理。

  • 验证方式:在服务端路由(比如app/api/test/route.ts)而非服务端组件里加console.log,启动生产服务后请求该接口,看终端是否有输出。如果路由里能输出,说明是服务端组件的日志被框架拦截了。
  • 处理:如果要强制开启服务端组件的生产日志,可在next.config.js中添加配置:
/** @type {import('next').NextConfig} */
const nextConfig = {
  logging: {
    fetches: {
      fullUrl: true,
    },
    serverRuntimeConfig: {
      logger: {
        level: 'debug',
      },
    },
  },
}

module.exports = nextConfig

注意:这个配置仅对框架内置日志生效,自定义console.log可能仍需用Winston统一接管。

2. Winston配置的生产环境适配问题

Winston日志无法写入,大概率是路径或权限问题:

  • 绝对路径替代相对路径:生产模式下Next.js的工作目录可能和开发时不同,相对路径(比如./logs/app.log)会找不到位置,改用绝对路径:
const path = require('path');
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ 
      filename: path.join(process.cwd(), 'logs', 'app.log'),
    }),
  ],
});
  • 目录权限检查:Linux服务器上,PM2运行的用户可能没有日志目录的读写权限。执行chown -R 你的PM2运行用户:用户组 /项目路径/logs,或者提前创建目录:mkdir -p logs && chmod 755 logs。
  • 日志级别过滤:检查Winston配置的日志级别,比如如果设了level: 'error',那info级别的日志会被过滤掉。

3. PM2的日志捕获配置问题

PM2默认抓进程的stdout/stderr,但如果日志没输出到这些流,就看不到:

  • 给Winston加Console传输,让日志同时输出到终端:
transports: [
  new winston.transports.File({ filename: path.join(process.cwd(), 'logs', 'app.log') }),
  new winston.transports.Console({ format: winston.format.simple() }),
],
  • 用PM2配置文件指定日志路径:创建ecosystem.config.js,明确日志输出位置:
module.exports = {
  apps: [{
    name: 'next-app',
    script: 'npm',
    args: 'run start',
    env: {
      NODE_ENV: 'production',
    },
    error_file: './logs/pm2-error.log',
    out_file: './logs/pm2-out.log',
  }]
};

然后用pm2 start ecosystem.config.js启动,之后用pm2 logs next-app查看实时日志。

  • 环境变量继承:PM2启动时可能没继承项目环境变量,导致Winston配置读取错误,要在配置文件里明确需要的变量。

4. 服务端组件的渲染时机问题

如果你的服务端组件是静态生成(SSG)的,日志只会在npm run build阶段输出,生产运行时不会重复渲染,自然看不到日志。

  • 区分SSR/SSG:检查组件是否依赖请求参数、Cookie等动态数据(这些会触发SSR),或者是否用dynamic导入并设置ssr: true。如果是纯静态组件,日志只有构建阶段能看到。

5. Nginx反向代理的验证

Nginx本身不会拦截服务端日志,但如果反向代理配置错误,请求没到Next.js服务,也不会产生日志。直接在服务器上执行curl http://localhost:3000(替换成你的Next.js监听端口)测试,能触发日志说明是Nginx配置问题(比如路径匹配错误),不能触发就回到前面的排查点。

内容的提问来源于stack exchange,提问作者user3034683

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:32:50