温馨提示×

怎样定位nodejs日志错误

小樊
45
2026-09-18 14:50:46
栏目: 编程语言

定位 Node.js 日志中的错误,通常可以按下面几个层次来做:看日志内容 → 定位代码 → 复现与验证 → 加监控和日志。下面给你一套实用思路。


一、先看懂 Node.js 错误日志

1. 关注关键字段

Node.js 崩溃或报错一般会有类似内容:

Error: Cannot read property 'x' of undefined
    at getUser (/app/service/user.js:23:15)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)

重点看:

  • Error 类型TypeError / ReferenceError / SyntaxError / RangeError
  • 错误信息:告诉你“什么错了”
  • stack trace(调用栈):告诉你“在哪一行代码错的”

2. 区分同步错误和异步错误

  • 同步错误:直接抛在调用栈里
  • 异步错误(Promise / callback):
    • 未 catch 的 Promise:UnhandledPromiseRejectionWarning
    • 回调错误:通常第一个参数是 err

二、用日志定位问题位置

1. 使用结构化日志(推荐)

不要只用 console.log,用日志库:

  • winston
  • pino
  • bunyan

示例(pino):

logger.error({ err, userId }, 'user login failed')

好处:

  • 有时间戳
  • 有上下文(userId、requestId)
  • 易检索

2. 给请求加 traceId(非常重要)

在 HTTP 请求中加 requestId

app.use((req, res, next) => {
  req.requestId = uuid()
  next()
})

日志中带上:

logger.error({ requestId: req.requestId, err })

这样你可以:

用 requestId 把一次请求的所有日志串起来


三、定位代码的常用方法

1. 根据 stack trace 定位

例如:

at getUser (/app/service/user.js:23:15)

直接打开 user.js 第 23 行

2. 本地复现

  • 用相同参数调用接口
  • 写单元测试复现
expect(() => getUser(null)).toThrow()

3. 加临时日志(快速验证)

console.log('user=', user)

确认:

  • 是否为 undefined
  • 是否异步未等待
  • 是否数据格式不对

四、常见 Node.js 错误及定位点

错误 常见原因 定位点
Cannot read property of undefined 对象未初始化 上游数据 / DB 返回
UnhandledPromiseRejection Promise 没 catch async/await
ECONNREFUSED 服务连不上 数据库 / Redis
ETIMEDOUT 网络慢 第三方接口
Memory Leak 闭包 / 缓存 heapdump

五、线上环境怎么定位

1. 保留 stack trace

Error.captureStackTrace(err)

2. 异常统一捕获

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

process.on('unhandledRejection', err => {
  logger.error({ err }, 'unhandledRejection')
})

3. 使用 APM(强烈推荐)

  • Sentry
  • Datadog
  • Elastic APM

可以:

  • 自动收集错误
  • 看到用户、请求、代码行

六、一个标准排查流程(总结)

  1. 看错误类型和 message
  2. 看 stack trace 定位文件和行号
  3. 用 requestId 拉全链路日志
  4. 本地复现
  5. 加日志或单测验证
  6. 修复并加监控

如果你愿意,可以把具体的 Node.js 错误日志贴出来,我可以直接帮你定位是哪一行、什么原因、怎么改。

0