Debian 上 Node.js 日志错误追踪实操指南
一 定位日志来源与查看路径
- 应用日志:优先查看应用写入的日志文件(如 error.log、combined.log),或使用日志库(如 Winston/Bunyan)输出的文件与控制台日志。
- 服务日志:若以 systemd 管理,使用命令查看服务日志:
- 查看实时日志:journalctl -u nodeapp.service -f
- 按时间过滤:journalctl -u nodeapp.service --since “2025-12-10 10:00:00”
- 系统日志:排查系统层面的异常(权限、OOM、启动失败等):
- grep node /var/log/syslog
- 内核与驱动线索:dmesg | grep -i node
- 调试输出:开发阶段可开启 DEBUG=模块名 环境变量输出模块内部日志,例如:DEBUG=http node app.js。
以上路径覆盖了应用、服务、系统与调试四类关键日志来源,有助于快速缩小问题范围。
二 应用内日志与错误捕获最佳实践
- 使用结构化日志库(如 Winston/Bunyan),按级别输出到不同目标,便于检索与告警:
- 示例(Winston):
- const winston = require(‘winston’);
- const logger = winston.createLogger({ level: ‘info’, format: winston.format.json(), transports: [ new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }), new winston.transports.File({ filename: ‘combined.log’ }), new winston.transports.Console() ]});
- logger.info(‘info 消息’); logger.error(‘error 消息’);
- 全局异常兜底:务必监听并上报 uncaughtException 与 unhandledRejection,避免进程静默退出:
- process.on(‘unhandledRejection’, (reason, promise) => { logger.error(‘未处理的拒绝’, { reason, promise }); });
- process.on(‘uncaughtException’, (err) => { logger.error(‘未捕获异常’, err); process.exit(1); });
- 请求链路追踪:在日志中加入 requestId(如中间件生成 UUID),配合统一日志格式,便于跨模块与跨服务串联分析。
- 诊断报告:在 Node.js v14+ 可使用 Diagnostic Report 生成包含 JS 堆栈与本机堆栈的诊断信息,用于疑难问题定位。
上述做法能显著提升错误可观测性、可回溯性与定位效率。
三 运行环境与系统层面的排查
- 进程退出码:检查 Node.js 进程退出码(如未捕获异常常见为 1),配合日志定位根因。
- 资源与内核线索:
- 内存与 OOM:dmesg | grep -i oom
- 系统级事件:grep node /var/log/syslog
- 动态追踪:必要时使用 strace 跟踪系统调用与信号,定位文件、网络、权限等底层问题。
- 调试器与开发工具:
- 内置调试:node inspect app.js
- 远程调试:node --inspect 配合 Chrome DevTools 或 VS Code 断点、观察表达式与调用栈。
这些手段能在应用日志不足时,提供系统级与执行路径的可观测性补充。
四 日志轮转与集中化
- 日志轮转:使用 logrotate 管理日志体积与保留策略,示例配置 /etc/logrotate.d/nodejs:
- /path/to/your/nodejs/app/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0644 node node sharedscripts postrotate systemctl reload nodeapp.service >/dev/null 2>&1 endscript }
- 校验与强制执行:logrotate -d /etc/logrotate.conf(校验),logrotate -f /etc/logrotate.conf(强制执行)。
- 集中式日志:将日志汇聚到 ELK Stack(Elasticsearch/Logstash/Kibana) 或 Graylog,实现统一检索、可视化与告警。
合理的轮转策略与集中化平台能避免磁盘被占满,并提升大规模环境下的故障定位效率。
五 将日志与错误追踪平台集成
- 接入 Sentry:实时捕获异常、堆栈与上下文,支持 release 与 environment 维度。
- 安装:npm install @sentry/node
- 初始化:
- const Sentry = require(‘@sentry/node’);
- Sentry.init({ dsn: ‘YOUR_SENTRY_DSN’, environment: process.env.NODE_ENV || ‘development’, release: ‘YOUR_RELEASE_VERSION’ });
- 全局兜底:在 uncaughtException 与 unhandledRejection 中上报并安全退出。
- 与日志库结合:将 Winston 与 Sentry 集成,错误级别日志同时写入文件与上报平台,兼顾本地留存与云端告警。
该方案能在错误爆发时快速告警、聚合相似错误并还原用户现场。