Ubuntu 下 Node.js 日志关键信息定位与排查
一 定位日志来源
- 应用日志:优先在项目目录的 logs/ 或配置文件(如 config.json)中指定的路径,常见文件名有 app.log、error.log、combined.log。
- 进程管理日志:使用 PM2 时,日志统一由 PM2 管理,可用 pm2 logs 查看。
- 系统日志:若通过 systemd 托管服务,用 journalctl -u <service_name> 查看;通用系统日志在 /var/log/syslog。
- 快速确认路径与实时查看:
- 查看应用日志:ls -l logs;tail -f logs/app.log
- 查看服务日志:sudo journalctl -u <service_name> -f
- 查看 PM2 日志:pm2 logs <app_name> --follow
二 快速筛选关键信息的命令
- 按级别筛选:grep -i “error|warn|fatal” app.log;统计数量:grep -i “error” app.log | wc -l
- 按时间窗口:awk ‘/2025-12-17 10:00:00/,/2025-12-17 11:00:00/’ app.log
- 实时过滤关键字:tail -f app.log | grep --line-buffered “timeout\|ECONNREFUSED”
- 仅看错误并附带上下文:grep -n -A5 -B5 “error” app.log
- 在 systemd 日志中筛选:sudo journalctl -u <service_name> --since “10 minutes ago” | grep -i “error”
- 在 PM2 日志中筛选:pm2 logs <app_name> --lines 1000 | grep WARN
三 常见关键错误与定位路径
- 端口被占用 EADDRINUSE:ss -ltnp | grep <端口> 或 lsof -i :<端口>;释放:kill -9
- 模块未找到 Module not found:npm install <模块名>;检查 node_modules 与 package.json 一致性
- 语法错误 SyntaxError:检查对应文件的行号与语法;本地复现后修正
- 未处理的 Promise 拒绝:为所有 Promise 加 .catch() 或使用 try/catch;临时兜底:process.on(‘unhandledRejection’, …)
- 监听器泄漏 MaxListenersExceededWarning:排查重复 on(‘event’),必要时 myEmitter.setMaxListeners(20) 并 removeListener
- 内存不足 JavaScript heap out of memory:短期提升 –max-old-space-size=4096;长期用 clinic/heapdump 定位泄漏
四 提升后续排查效率的实践
- 使用结构化日志与合适级别:生产以 error/warn 为主,开发可开启 debug;推荐 JSON 格式,便于检索与聚合(如 winston、pino)。
- 配置日志轮转:避免单文件过大,使用 logrotate 或 winston-daily-rotate-file 按日/大小切分并压缩归档。
- 集中化与可视化:接入 ELK/Graylog/Splunk,用 Kibana 建立索引与可视化面板,支持快速检索与告警。
- 性能与开销控制:高并发下优先 pino 等高性能库,采用异步写入,避免同步日志阻塞主线程。