温馨提示×

如何定位nodejs日志异常

小樊
48
2026-09-09 13:03:59
栏目: 编程语言

定位 Node.js 日志异常,通常可以按**“从现象到根因”**的思路分层排查。下面给你一套比较实用的方法和流程。


一、先明确「异常」是什么

先区分异常类型,定位方向完全不同:

  1. 进程崩溃
    • throw 未捕获异常
    • unhandledRejection
    • OOM(内存溢出)
  2. 业务逻辑异常
    • 接口返回错误码
    • 数据不对、状态异常
  3. 性能异常
    • 响应慢、CPU 高、内存涨
  4. 日志本身异常
    • 日志缺失、重复、格式乱

二、基础定位手段(最常用)

1. 看错误堆栈(最关键)

Node.js 异常一定会带堆栈:

node app.js
# 或
pm2 logs

重点看:

  • 出错文件 & 行号
  • 调用链(谁调用了谁)
  • 是同步错误还是 Promise 错误

2. 捕获未处理异常(必须做)

生产环境一定要加:

process.on('uncaughtException', (err) => {
  console.error('uncaughtException', err);
});

process.on('unhandledRejection', (reason) => {
  console.error('unhandledRejection', reason);
});

否则异常会“莫名其妙消失”。


3. 统一日志规范

避免 console.log 满天飞,推荐:

  • winston
  • pino
  • log4js

示例(pino):

logger.error({ err }, 'request failed');

日志里至少包含:

  • timestamp
  • level
  • traceId
  • userId / requestId
  • err.stack

三、按场景定位异常

场景 1:接口报错

步骤:

  1. 从 access log 找到异常请求
  2. requestId 串联日志
  3. 看是:
    • 参数错误
    • DB 超时
    • 第三方接口失败

场景 2:内存泄漏 / OOM

工具:

node --inspect app.js

或:

node --max-old-space-size=512 app.js

排查:

  • 全局变量
  • 缓存未清理
  • 闭包引用
  • 监听器未移除(EventEmitter

场景 3:异步问题(最常见)

典型问题:

  • Promise 没 catch
  • async 函数没 await
  • 回调里抛错

定位方式:

process.on('unhandledRejection', e => console.error(e));

场景 4:生产环境无日志

检查:

  • 日志级别(生产是否关了 debug)
  • 日志写入路径权限
  • 是否被 PM2 / Docker 吞掉

四、进阶定位工具

1. 性能 & 堆栈

  • clinic.js
  • 0x
  • node --prof

2. 分布式追踪

  • OpenTelemetry
  • Jaeger
  • Zipkin

3. 容器环境

kubectl logs pod-name
docker logs container-id

五、推荐的标准排查流程(实战)

  1. 复现问题
  2. 看进程日志 & 错误堆栈
  3. 用 requestId 串联日志
  4. 确认是代码 / 依赖 / 环境
  5. 加监控 & 告警,避免再次发生

如果你愿意,可以直接贴一段 Node.js 错误日志或代码,我可以帮你具体定位是哪里出了问题。

0