温馨提示×

如何通过Ubuntu日志排查Node.js错误

小樊
34
2025-12-09 23:57:33
栏目: 编程语言

排查思路总览

  • 明确日志来源:应用自身日志、进程管理日志(如 PM2)、系统日志(journald/syslog)。
  • 先定位再检索:先找到日志文件或日志流,再用关键字与时间窗缩小范围。
  • 关注三类关键信息:时间戳错误级别(ERROR/WARN/INFO)、堆栈跟踪
  • 结合运行方式:直接运行、PM2、或 systemd 服务,命令各不相同。
  • 必要时做在线调试与内存分析,避免反复重启造成现场丢失。

定位日志位置

  • 应用自身日志:常见在项目目录的 logs//var/log/yourapp/,文件名如 app.log、error.log、combined.log;若代码或配置显式指定路径,以配置为准。
  • PM2 管理:日志集中在 ~/.pm2/logs/,常见文件为 app-out.log、app-error.log,可用 pm2 logs 统一查看。
  • 系统日志:使用 journald 时查看 journalctl -u your-node-service;写入 syslog 时查看 /var/log/syslog
  • 第三方日志库:如 winston、log4js、morgan 等,可在代码中配置日志路径与滚动策略。

常用查看与分析命令

  • 实时查看应用日志:tail -f logs/app.log 或 tail -f logs/error.log
  • 关键字检索:grep -i “error” logs/error.log;结合正则可进一步过滤堆栈与模块名
  • 查看系统日志:sudo tail -f /var/log/syslog;按服务过滤:sudo journalctl -u your-node-service -f
  • PM2 日志:pm2 logs;按应用过滤:pm2 logs <app_name_or_id>;查看最近 N 行:pm2 logs --lines 1000
  • 时间窗定位:journalctl -u your-node-service --since “10 minutes ago”
  • 日志轮转:配置 logrotate 避免单文件过大、便于归档与清理

典型错误快速定位与修复

  • 端口被占用 EADDRINUSE:sudo lsof -i :端口号 找到进程 PID,sudo kill -9 释放端口
  • 模块未找到 Module not found:npm install <模块名> 补齐依赖
  • 语法错误 SyntaxError:检查对应文件与行号,修正语法后重启
  • 未处理的 Promise 拒绝:为所有 Promise 加 .catch() 或使用 try-catch;临时兜底可监听 process.on(‘unhandledRejection’)
  • 监听器泄漏 MaxListenersExceededWarning:避免重复添加监听器,必要时 myEmitter.setMaxListeners(20) 并显式 removeListener
  • 内存不足 JavaScript heap out of memory:短期提升上限 node --max-old-space-size=4096 app.js;长期用 clinic/heapdump 分析泄漏并优化数据结构与缓存策略

提升可观测性的实践

  • 使用结构化日志(如 JSON)与明确级别(DEBUG/INFO/WARN/ERROR),便于检索与聚合
  • 规范日志路径与权限,生产环境避免仅用 console.log,建议使用 winston/log4js 并配置按大小/时间滚动与保留天数
  • 将 Node.js 接入系统日志(journald/syslog),统一运维与审计;PM2 场景统一用 pm2 logs 与日志文件双轨留存
  • 搭建集中式日志平台(如 ELK/Graylog)做可视化与告警,便于跨实例与历史回溯

0