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
相关产品推荐
相关产品推荐

