温馨提示×

怎样分析Nodejs错误日志

小樊
45
2026-07-07 10:06:16
栏目: 编程语言

分析 Node.js 错误日志是定位线上问题、优化稳定性的关键步骤。下面从日志来源、常见错误类型、分析思路、工具与实践几个方面系统说明。


一、Node.js 错误日志的常见来源

1. 应用层日志

  • console.error
  • 日志库(winston、pino、bunyan)
  • 自定义 error handler

2. 运行时错误

  • 未捕获异常
    throw new Error('xxx')
    
  • Promise 未捕获拒绝
    Promise.reject(new Error('xxx'))
    

3. 系统 / 框架日志

  • Express / Koa 中间件错误
  • 中间件 next(err)
  • 进程崩溃日志(PM2、Docker)

4. 操作系统 / 容器日志

  • stdout / stderr
  • Docker logs
  • K8s pod logs

二、Node.js 常见错误类型

1. 同步错误(throw)

throw new Error('sync error')
  • 如果没有 try/catch,进程可能退出
  • 日志中通常包含:
    • message
    • stack trace
    • 文件名 + 行号

2. 异步错误(Promise / callback)

fs.readFile('a.txt', (err, data) => {
  if (err) throw err
})

常见错误:

  • ERR_FS_FILE_TOO_LARGE
  • ENOENT(文件不存在)

3. 网络错误

错误 说明
ECONNREFUSED 服务未启动
ETIMEDOUT 超时
ENOTFOUND DNS 问题
EPIPE 客户端提前断开

4. 内存 / 资源错误

  • JavaScript heap out of memory
  • EMFILE(文件句柄耗尽)
  • ENOMEM

三、错误日志分析的核心思路(非常重要)

✅ 第一步:看错误类型 + 错误码

Error: connect ECONNREFUSED 127.0.0.1:3306

→ 明确是 网络 / 数据库问题


✅ 第二步:看 stack trace(调用栈)

at Database.query (db.js:23)
at UserService.getUser (user.js:45)
  • 定位到具体文件
  • 判断是业务代码还是依赖库

✅ 第三步:看发生时间 & 频率

  • 是偶发还是持续?
  • 是否集中在某个时间段?
  • 是否和发布、流量高峰相关?

✅ 第四步:看上下文日志(前后日志)

  • 请求 ID(traceId)
  • 用户 ID
  • 入参 / 返回值
  • 上游服务状态

四、典型错误日志示例分析

示例 1:数据库错误

Error: ER_ACCESS_DENIED_ERROR: Access denied for user

✅ 分析:

  • 配置问题
  • 环境变量错误
  • 权限不足

示例 2:内存溢出

FATAL ERROR: Ineffective mark-compacts near heap limit

✅ 分析:

  • 内存泄漏
  • 大对象缓存
  • 未释放闭包 / 定时器

示例 3:未捕获 Promise

UnhandledPromiseRejectionWarning

✅ 分析:

  • 缺少 catch
  • 需要全局监听:
process.on('unhandledRejection', err => {
  console.error(err)
})

五、分析工具推荐

1. 日志分析

  • 本地
    • grep / awk
    • less / tail -f
  • 线上
    • ELK(Elasticsearch + Logstash + Kibana)
    • Grafana Loki

2. 错误监控

  • Sentry
  • Prometheus + AlertManager
  • PM2 logs

3. 性能 / 内存分析

  • node --inspect
  • clinic.js
  • heapdump

六、最佳实践(强烈建议)

统一错误结构

{
  code: 'ERR_USER_NOT_FOUND',
  message: '用户不存在',
  stack: '...',
  requestId: 'abc123'
}

区分错误类型

  • 业务错误(可预期)
  • 系统错误(不可预期)

全局兜底

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

日志要可追踪

  • traceId / requestId
  • 用户上下文
  • 耗时记录

七、如果你愿意,我可以进一步帮你

你可以直接发我:

  • 一段真实错误日志
  • 报错截图
  • 使用的框架(Express / Koa / NestJS)

我可以 逐行帮你分析 + 给出修复方案

0