在 Ubuntu 中分析 Node.js 日志趋势的实用方案
一 日志采集与结构化
- 使用结构化日志库输出 JSON,便于后续聚合与统计。示例(winston):
- 安装:
npm i winston
- 配置:
- 使用 winston 或 pino 输出 JSON;为错误与全量日志分别写入不同文件(如 error.log、combined.log)。
- 在应用中记录关键维度:如 timestamp、level、route、method、statusCode、responseTimeMs、userId(脱敏)、error.message、traceId。
- 目的:统一字段、便于 grok/JSON 解析、支持按时间窗口做趋势统计与可视化。
二 命令行快速趋势分析
- 实时查看新增日志:
tail -f /var/log/nodejs/combined.log
- 统计错误数:
grep -c "ERROR" /var/log/nodejs/combined.log
- 按小时统计错误趋势(假设日志含 ISO8601 时间如 2025-12-19T10:xx:xx):
grep "ERROR" /var/log/nodejs/combined.log | awk '{split($1, a, "T"); gsub(/:/, "", a[2]); print a[1]"T"substr(a[2],1,2)}' | sort | uniq -c
- Top 5 报错信息:
grep "ERROR" /var/log/nodejs/combined.log | cut -d' ' -f5- | sort | uniq -c | sort -nr | head -5
- 响应时间 P95/P99(假设字段为 responseTimeMs):
- 先提取数值:
grep "responseTimeMs" /var/log/nodejs/combined.log | sed 's/.*"responseTimeMs":\([0-9]*\).*/\1/' > times.txt
- 计算分位(需 datamash):
datamash count 1 < times.txt 与 datamash perc:95 1 < times.txt、datamash perc:99 1 < times.txt
- 说明:以上命令可按需组合为脚本,定期输出到趋势报告(CSV/JSON),用于周报或告警基线。
三 集中化与可视化分析
- 方案选型与适用场景
- ELK Stack(Elasticsearch + Logstash + Kibana):适合复杂查询、长期留存与多维可视化。
- Grafana Loki + Promtail:轻量、低成本,适合云原生与容器场景。
- Graylog:集中式日志平台,部署相对简单。
- Logstash 解析 Node.js JSON 日志示例(/etc/logstash/conf.d/nodejs.conf):
- 输入:
file { path => "/var/log/nodejs/*.log" start_position => "beginning" }
- 解析:
json { source => "message" }(若已是 JSON 行)
- 时间解析:
date { match => [ "timestamp", "ISO8601" ] target => "@timestamp" }
- 输出:
elasticsearch { hosts => ["localhost:9200"] index => "nodejs-%{+YYYY.MM.dd}" }
- Kibana 趋势分析
- 建立索引模式(如 nodejs-*),按 @timestamp 做时间直方图。
- 指标面板:错误率(ERROR 占比)、请求速率(按 route/method 分组计数)、P95/P99 响应时间、Top 错误、活跃 traceId 链路。
- 告警:当 5xx 比例 > 1% 或 P95 > 2s 持续 5 分钟 触发通知。
四 日志轮替与运维实践
- 使用 logrotate 防止日志无限增长(/etc/logrotate.d/nodejs):
- 配置示例:
/var/log/nodejs/*.log { daily missingok rotate 7 compress notifempty create 0640 root adm }
- 使用 PM2 管理进程与日志:
- 启动:
pm2 start app.js --name api
- 实时查看:
pm2 logs api
- 按天轮替:
pm2 set pm2-logrotate:max_size 100M 与 pm2 set pm2-logrotate:retain 7
- 建议:为趋势分析保留至少 7–14 天 数据;对敏感字段(如 userId、token)做脱敏后再写入日志。
五 性能与 APM 辅助趋势判断
- 在日志中埋点关键性能数据:如 process.memoryUsage()、process.cpuUsage()、event loop lag、GC 信息(通过 node --inspect 或 clinic.js 辅助定位)。
- 结合 APM(如 Elastic APM、New Relic、Datadog)获取 服务地图、依赖耗时、错误追踪 与 指标曲线,与日志趋势交叉验证,快速定位瓶颈与异常根因。