Node.js 日志在 Ubuntu 的错误追踪方法
一 定位日志来源与快速查看
- 应用日志:优先查看应用配置或代码中定义的日志路径,常见位置为项目目录下的 logs/、app.log、error.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):便于分级、落盘与后续检索,建议区分 error 与 combined 两类日志,开发环境同时输出到控制台。
- 安装: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
}
上述方案适合生产环境的长期可观测性建设,便于快速检索、趋势分析与容量治理。