Ubuntu 上 Node.js 日志分析实操指南
一 日志收集与规范化
- 在应用侧使用结构化日志库,优先输出为JSON,便于检索与聚合。示例(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’ })
- ]
- });
- logger.info(‘Server is running’, { port: 3000 });
- 若输出到控制台,建议使用pino并配合pino-pretty仅在开发环境美化,生产环境保持 JSON。
- 统一字段约定:如timestamp、level、msg、service、trace_id、userId、method、url、status、responseTime、err(包含 name/message/stack)等,便于后续聚合与可视化。
二 快速定位与命令行分析
- 定位日志位置
- 应用日志:项目目录下的logs/ 或自定义路径;系统日志:/var/log/syslog、/var/log/messages;服务日志(systemd):使用journalctl -u your-node-service;PM2 管理:pm2 logs your-app。
- 常用命令
- 实时查看:tail -f logs/error.log
- 错误级别统计:grep -i “error” logs/combined.log | wc -l
- 按时间段筛选:awk ‘/2025-12-12 10:00:00/,/2025-12-12 11:00:00/’ logs/combined.log
- 提取特定字段(JSON 行日志):cat logs/combined.log | jq ‘select(.level==“error”) | .msg’
- 统计 Top URL:cat logs/combined.log | jq -r ‘.url’ | sort | uniq -c | sort -nr | head
- 统计 HTTP 状态码分布:cat logs/combined.log | jq ‘select(.status) | .status’ | sort | uniq -c | sort -nr
- 追踪异常堆栈:grep -A 20 -B 5 “stack trace” logs/error.log
- 提示:若日志为 JSON,请优先使用jq进行解析与筛选,能显著降低误匹配与字段提取成本。
三 集中化与可视化分析
- 自建平台
- ELK Stack(Elasticsearch + Logstash + Kibana):适合复杂查询、长期留存与可视化;Logstash 可用grok解析时间戳与日志级别,Kibana 构建仪表盘与告警。
- Grafana Loki + Promtail/Grafana:轻量、低成本,适合云原生与微服务场景。
- Graylog:集中式日志管理,开箱即用。
- 快速上手 ELK(示例)
- Logstash 配置(/etc/logstash/conf.d/nodejs.conf):
- input { file { path => “/var/log/nodejs/*.log” start_position => “beginning” } }
- filter {
- grok { match => { “message” => “%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}” } }
- date { match => [ “timestamp”, “ISO8601” ] }
- }
- output { elasticsearch { hosts => [“localhost:9200”] index => “nodejs-logs-%{+YYYY.MM.dd}” } }
- 启动后在 Kibana(http://your_server:5601) 创建索引模式并构建仪表盘(如错误率、P95/P99 响应时间、每分钟请求数等)。
四 日志轮转与运维最佳实践
- 使用 logrotate 管理日志体积与保留期(/etc/logrotate.d/nodejs):
- /var/log/nodejs/*.log {
- daily
- missingok
- rotate 7
- compress
- notifempty
- create 0640 root adm
- }
- 避免单文件过大、便于归档与快速检索;与集中化平台配合时,确保轮转后文件仍可被采集。
五 常见错误与定位路径
- EADDRINUSE(端口被占用):lsof -i :端口号 查找进程,kill -9 进程ID 释放端口。
- Module not found:npm install 缺失模块。
- SyntaxError:检查并修复语法错误。
- UnhandledPromiseRejectionWarning:为所有 Promise 增加 .catch() 或使用 try-catch;必要时全局监听 process.on(‘unhandledRejection’)。
- MaxListenersExceededWarning:事件监听器泄漏,检查重复添加并 removeListener,或合理设置 setMaxListeners。
- 内存不足(JavaScript heap out of memory):短期可通过 node --max-old-space-size=4096 提升上限;长期应排查内存泄漏(如 clinic.js、heapdump 等)。