Ubuntu 下用 Node.js 日志监控系统性能的可落地方案
一 整体架构与关键指标
- 采集层:在 Node.js 中使用结构化日志(如 Winston、Pino、Bunyan),输出 JSON 并携带关键性能字段;HTTP 层接入 morgan 记录请求耗时;必要时埋点记录 process.memoryUsage()、process.cpuUsage()、事件循环延迟。
- 传输与存储:开发/中小规模可用 PM2 日志聚合;生产环境建议接入 ELK(Elasticsearch、Logstash、Kibana) 或 Graylog 集中存储与检索。
- 可视化与告警:用 Kibana/Grafana 构建仪表盘,对 P95/P99 响应时间、吞吐(req/s)、错误率、内存 RSS、CPU 使用率 设置阈值告警。
- 系统层监控:并行观测 top/htop、vmstat、iostat、free、df 等,关联应用日志定位资源瓶颈。
二 日志埋点与输出规范
- 结构化与级别:统一使用 JSON,生产以 info/warn/error 为主,避免冗余。
- 请求日志:记录 method、url、statusCode、responseTimeMs、contentLength、remoteAddr、userAgent、traceId。
- 性能采样:定时输出 memoryUsage()、cpuUsage();关键代码段用 console.time / console.timeEnd 或高精度计时。
- 事件循环延迟:简单测量可用 async_hooks 或第三方库,记录超过阈值的延迟样本。
- 日志轮转:使用 winston-daily-rotate-file 或 logrotate 控制单文件大小与保留周期,避免磁盘被占满。
- 异步与非阻塞:选用支持异步写入的传输,避免日志 I/O 阻塞主线程。
三 采集传输与可视化配置
-
PM2 快速落地
- 启动并开启日志轮转:
- 安装:npm i -g pm2
- 启动:pm2 start app.js -i max --name api
- 日志:pm2 logs api(实时查看)、pm2 logrotate(按日轮转)
- 适合单机或少量实例,便于“先跑起来”。
-
ELK 集中化方案(示例)
- 安装(Ubuntu 可用 apt):sudo apt-get update && sudo apt-get install elasticsearch logstash kibana
- 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}” } }
- output { elasticsearch { hosts => [“localhost:9200”] index => “nodejs-logs-%{+YYYY.MM.dd}” } }
- 启动:sudo systemctl start logstash && sudo systemctl enable logstash
- Kibana:访问 http://服务器IP:5601,创建索引模式(如 nodejs-logs-*),构建 P95/P99 响应时间、吞吐、错误率 等可视化面板并设置告警。
四 关键查询与告警规则示例
-
日志侧分析(命令行快速洞察)
- 错误数:grep “ERROR” combined.log | wc -l
- 响应时间分布(假设字段为 responseTimeMs):
- 平均:awk -F’“responseTimeMs”:’ ‘{sum+=$2; n++;} END {print sum/n}’ combined.log
- P95:sort -t: -k2 -nr combined.log | awk -F’“responseTimeMs”:’ ‘NR<=int(NR*0.95){sum+=$2} END{print sum/NR}’
- Top 10 慢请求:awk -F’“url”:“|”,“responseTimeMs”’ ‘{print $4, $6}’ combined.log | sort -k2 -nr | head -10
- 内存峰值:awk ‘/Memory Usage/{print $3}’ combined.log | sort -nr | head -10
-
可视化与告警建议
- 指标:P50/P95/P99 响应时间、请求速率(req/s)、错误率(HTTP 5xx / total)、RSS/HeapUsed、CPU 使用率。
- 阈值示例:P95 > 1000ms、5xx 错误率 > 1%、1 分钟请求速率突降 >50%、RSS 连续 5 分钟上涨 >20%。
- 在 Kibana/Grafana 中配置阈值告警,联动 邮件/企业微信/钉钉/Slack 通知。
五 深度排查与性能剖析
- CPU/内存热点:使用 node --inspect 配合 Chrome DevTools 做性能/内存剖析;或用 node --prof 生成 V8 剖析文件,再用 –prof-process 分析。
- 事件循环阻塞:在关键路径埋点测量延迟,结合 async_hooks 观察异步上下文耗时。
- 堆与泄漏:用 heapdump 生成堆快照,Chrome DevTools Memory 面板对比快照定位泄漏对象。
- 系统层瓶颈:结合 top/htop、vmstat、iostat、free、df 判断是否为 CPU、内存、I/O 或磁盘空间导致。
- 负载与回归:用 k6/wrk/artillery 做压测,复现高并发下的性能退化并对照日志与剖析结果优化。