快速定位 Ubuntu 上 Node.js 日志问题的实用流程
一 定位日志源与实时查看
- 确认日志落点:应用常把日志写到项目内的 logs/ 目录,或通过 Winston/Pino/Bunyan 写入文件;若以 systemd 服务运行,使用 journalctl -u your-service-name -f 实时查看;前端问题用浏览器 开发者工具 Console/Network 辅助排查。必要时检查 /var/log/ 下的相关文件。
- 常用实时命令:
- 实时跟踪单个文件:tail -f /path/to/app.log
- 跟踪服务日志:journalctl -u your-service-name -f
- 搜索关键字(如 error):grep -n ‘error’ /path/to/app.log
- 查看最近 N 行:tail -n 200 /path/to/app.log
这些步骤能迅速确定“日志在哪、当前在发生什么”。
二 高命中率的关键字与模式检索
- 错误与异常:搜索 error、Error、ERR、Exception、throw、rejected、failed、timeout、ECONNREFUSED、ETIMEDOUT、ENOTFOUND。
- HTTP 与性能:搜索 HTTP/1.1、POST/GET、4xx/5xx、statusCode、responseTime、latency、timeout,定位失败请求与慢请求。
- 第三方库线索:关注日志中的 库名/模块名、版本号 与 堆栈跟踪(stack trace),便于判断是否为依赖兼容性或调用链问题。
- 环境与资源:结合 EADDRINUSE(端口占用)、EMFILE(文件描述符不足) 等错误码,快速指向端口冲突或资源瓶颈。
- 示例命令:
- 错误与堆栈:grep -n -A5 -B5 ‘error|Error|Exception’ app.log
- 失败请求:grep -n ‘statusCode=[45][0-9][0-9]’ app.log
- 超时与网络:grep -n ‘timeout|ECONNREFUSED|ETIMEDOUT’ app.log
- 慢请求(若日志含 responseTime):awk ‘$NF > 1000 {print $0}’ app.log(单位毫秒,阈值可按需调整)
上述检索能迅速把范围从“全量日志”收敛到“可疑事件与调用链”。
三 提升日志可读性与可定位性
- 统一结构与级别:使用 Winston/Pino/Bunyan 输出 JSON 或结构化日志,包含 timestamp、level、msg、pid、reqId、method、url、status、responseTime、err.stack 等关键字段;为错误单独设 error.log,普通与全量分 combined.log。
- 动态调节日志级别:开发或排障时临时提升到 debug,生产以 info/warn/error 为主;可通过环境变量控制,如 WINSTON_LEVEL=debug、PINO_LEVEL=debug。
- HTTP 请求日志:在 Express 中使用 morgan 输出 combined 或自定义格式,必要时对 4xx/5xx 单独记录,便于快速筛选异常流量。
- 示例(Winston 片段):
- 日志级别与环境变量:
- logger.level = process.env.WINSTON_LEVEL || ‘info’
- 按级别分文件:
- new winston.transports.File({ filename: ‘error.log’, level: ‘error’ })
- new winston.transports.File({ filename: ‘combined.log’ })
这些配置能让你“搜得到、看得懂、分得清”。
四 常见场景的快查命令清单
| 场景 |
快速命令或要点 |
| 服务启动失败 |
journalctl -u your-service -b;检查 EADDRINUSE、配置路径、权限 |
| 某接口偶发 5xx |
grep -n ‘url=“/api/xxx”|statusCode=5’ app.log;配合 -A/-B 看前后日志与堆栈 |
| 数据库/Redis 连接异常 |
grep -n ‘ECONNREFUSED|ETIMEDOUT|timeout’ app.log;核对地址、端口、密码、网络 |
| 内存泄漏迹象 |
观察日志中 heap out of memory / FATAL ERROR;结合 top/htop 与 –max-old-space-size 调整 |
| 第三方库报错 |
搜索 库名 与 版本,查看 堆栈跟踪;核对 package.json 与 npm list |
| 前端页面报错 |
浏览器 Console/Network 找 JS 错误 与 HTTP 失败;对照服务端日志的 reqId 串联 |
| 以上命令覆盖最常见的故障面,能在分钟级完成定位闭环。 |
|
五 排障后的收尾与预防
- 日志轮转与容量控制:使用 logrotate 定期压缩归档、清理旧日志,避免磁盘被占满导致服务异常。
- 集中化与告警:将日志接入 ELK(Elasticsearch/Logstash/Kibana) 或 Graylog,配置 错误/延迟阈值 告警,缩短 MTTR。
- 依赖与版本治理:固定 依赖版本,升级前在预发环境验证;遇到第三方库问题优先查 版本兼容 与 已知 issue。
- 资源与健康检查:对 CPU/内存/磁盘/连接数 设置监控与阈值告警,结合日志定位根因。
这些措施能把“临时救火”转为“持续可观测”。