- 首页 >
- 问答 >
-
编程语言 >
- 如何通过Ubuntu日志排查Node.js错误
如何通过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)做可视化与告警,便于跨实例与历史回溯