在 Ubuntu 上监控 Node.js 日志流量
一 目标与总体思路
- 明确“日志流量”的度量口径:常见为请求量(QPS)、响应时间分布、错误率、状态码分布、来源 IP/接口路径等。
- 日志采集与结构化:让 Node.js 输出结构化日志(JSON),便于后续统计与可视化。
- 实时查看与告警:本地用命令行工具快速排查,集中式方案做长期存储、聚合、仪表盘与阈值告警。
二 本地实时查看与快速排查
- 直接跟踪日志文件:
- 实时查看:tail -f /var/log/myapp.log
- 多文件与高亮:sudo apt-get install multitail;multitail app.log
- 定时刷新:watch -n 1 ‘cat app.log’
- 使用进程管理器的日志功能(如用 PM2 启动):
- 实时日志:pm2 logs
- 指定应用:pm2 logs <app_name>
- JSON 格式:pm2 logs --json
- 若应用由 systemd 托管,可用 journalctl 查看服务日志:journalctl -u your-service.service。
三 结构化日志与采集配置
- 在 Node.js 中输出结构化日志(示例用 Winston,也可选 pino/morgan):
- 安装:npm install winston
- 配置要点:level 设为 info,format 用 winston.format.json(),按级别拆分文件(如 error/combined)。
- 将日志送入集中系统(二选一或并用):
- 直连 Logstash/TCP:使用 winston-logstash 将日志以 JSON Lines 发到 Logstash TCP 5000 端口,再由 Logstash 写入 Elasticsearch。
- 文件采集:Logstash/Fluentd 以 tail 方式读取日志文件,解析后写入 Elasticsearch,在 Kibana 做可视化与告警。
四 集中式日志平台与关键指标
- 方案选型与部署要点:
- ELK Stack(Elasticsearch + Logstash + Kibana):Logstash 负责采集与解析(如 grok 解析时间戳/级别/消息),ES 存储,Kibana 建立索引模式与仪表盘。
- Fluentd:轻量采集,支持直接写入 Elasticsearch 或转发至 Loki/Graylog。
- 远程 Syslog:通过 rsyslog/syslog-ng 将日志发往远程日志服务器(UDP/TCP 514),便于统一汇聚与审计。
- 在 Kibana/Grafana 中关注的典型面板与指标:
- QPS/每分钟请求数、响应时间 P50/P95/P99、HTTP 状态码分布、错误率、Top URL/来源 IP、每分钟错误数、日志级别分布。
五 命令行流量分析速查表
- 统计每分钟请求数(假设日志含 ISO8601 时间戳与请求行):
- grep -oP ‘\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}’ app.log | sort | uniq -c
- 统计响应时间 P95(假设字段为 responseTimeMs 的 JSON 日志):
- awk -F’“responseTimeMs”:’ ‘{print $2}’ app.log | cut -d’,’ -f1 | sort -n | awk ‘{a[NR]=$1} END{print “P95:”,a[int(NR*0.95)]}’
- 统计 5xx 错误数:
- grep -c ‘“statusCode”:5[0-9]{2}’ app.log
- 统计 Top 10 URL(假设字段为 url):
- awk -F’“url”:“’ ‘{print $2}’ app.log | cut -d’”’ -f1 | sort | uniq -c | sort -nr | head
- 按分钟统计各状态码数量(假设字段为 timestamp 与 statusCode):
- awk -F’“timestamp”:“’ '{t=$2; gsub(/T.*/,”“,t); a[t”,“$0]++} END{for(i in a){split(i,b,”,"); print b[1],b[2]}}’ app.log | sort | uniq -c
以上路径可覆盖从“本地快速排查”到“集中化长期观测”的完整链路:先在 Node.js 侧输出结构化日志,再用 tail/multitail/PM2 实时查看,随后通过 Logstash/Fluentd 汇聚到 Elasticsearch,最终在 Kibana 配置指标面板与阈值告警,实现“日志即流量”的可观测性。