温馨提示×

Node.js日志在Ubuntu中的错误追踪方法

小樊
35
2025-11-16 06:45:58
栏目: 编程语言

Node.js 日志在 Ubuntu 的错误追踪方法

一 定位日志来源与快速查看

  • 应用日志:优先查看应用配置或代码中定义的日志路径,常见位置为项目目录下的 logs/app.logerror.log,或使用日志库写入的自定义文件。使用命令实时查看与检索:
    • 实时跟踪:tail -f /path/to/your.log
    • 关键字检索:grep -i ‘Error’ /path/to/your.log
  • PM2 管理:若使用 PM2,可直接查看与过滤进程日志:
    • 全部日志:pm2 logs
    • 指定应用:pm2 logs <app_name_or_id>
    • 最近 N 行并持续跟踪:pm2 logs --lines 1000 --follow
  • systemd 服务日志:若以服务运行(如 /etc/systemd/system/node-app.service),使用 journalctl 查看:
    • 指定服务:journalctl -u your-app-service-name
    • 实时跟踪:journalctl -u your-app-service-name -f
  • 系统日志:部分未捕获的崩溃或系统级事件会进入 /var/log/syslog,可辅助排查:
    • 实时跟踪:sudo tail -f /var/log/syslog 以上方法覆盖应用日志、进程管理日志与系统日志的常见场景,适合快速定位错误入口与上下文。

二 应用内日志与错误追踪集成

  • 结构化日志(Winston):便于分级、落盘与后续检索,建议区分 errorcombined 两类日志,开发环境同时输出到控制台。
    • 安装:npm install winston
    • 示例:
      • const winston = require(‘winston’);
      • const logger = winston.createLogger({ level: ‘info’, format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }), new winston.transports.File({ filename: ‘combined.log’ }) ] });
      • if (process.env.NODE_ENV !== ‘production’) { logger.add(new winston.transports.Console({ format: winston.format.simple() })); }
      • logger.info(‘服务启动’, { port: 3000 });
      • logger.error(‘异常发生’, { err: err.message, stack: err.stack });
  • HTTP 请求日志(Morgan):记录访问日志,配合文件流落盘,便于分析接口调用与响应状态。
    • 安装:npm install morgan
    • 示例:
      • const morgan = require(‘morgan’);
      • const fs = require(‘fs’);
      • const path = require(‘path’);
      • const accessLogStream = fs.createWriteStream(path.join(__dirname, ‘access.log’), { flags: ‘a’ });
      • app.use(morgan(‘combined’, { stream: accessLogStream }));
  • 异常监控平台(Sentry):捕获未处理异常与性能问题,形成事件聚合与告警。
    • 安装:npm install @sentry/node
    • 示例:
      • const Sentry = require(‘@sentry/node’);
      • Sentry.init({ dsn: ‘YOUR_SENTRY_DSN’, environment: ‘production’ });
      • app.use(Sentry.Handlers.errorHandler());
      • app.get(‘/’, () => { throw new Error(‘Test error’); }); 以上集成能在应用侧输出高质量结构化日志,并将关键异常上报至平台,提升定位效率。

三 系统级追踪与调试

  • 运行时调试:使用 Node.js 调试协议定位复杂问题。
    • 启动:node --inspect-brk app.js
    • Chrome 打开 chrome://inspect 连接调试器,设置断点、观察调用栈与变量。
  • 资源与依赖排查:
    • 端口占用(如 EADDRINUSE):sudo lsof -i :端口号,释放占用进程:sudo kill -9
    • 依赖问题:npm list 检查版本与缺失依赖,npm install <模块名> 修复 Module not found
    • 配置与环境:核对 config 文件与 环境变量(如 printenv),避免错配导致启动或运行异常
  • 系统日志联动:结合 journalctl/var/log/syslog 检索服务启动、崩溃、权限与 OOM 等系统层线索,与业务日志交叉验证。

四 集中化与长期运维

  • 集中日志平台(ELK/Graylog):将应用日志统一采集、解析与可视化,适合多实例与多环境。
    • 思路:Filebeat/Logstash 采集 /var/log/nodejs/*.log,以 Grok 解析时间戳与日志级别,写入 Elasticsearch,在 Kibana 构建查询与仪表盘。
  • 指标与告警(Prometheus + Grafana):暴露 /metrics 端点,采集 HTTP 延迟、吞吐、错误率 等指标,配置阈值告警与可视化面板。
  • 日志轮转与容量管理:使用 logrotate 定期压缩归档,防止磁盘被占满。
    • 示例(/etc/logrotate.d/nodejs):
      • /var/log/nodejs/*.log { daily missingok rotate 7 compress notifempty create 0640 root adm } 上述方案适合生产环境的长期可观测性建设,便于快速检索、趋势分析与容量治理。

0