Ubuntu 环境下常用的 Node.js 日志分析工具与方案
一 命令行与系统工具
- 实时查看与追踪
- 使用 tail -f 实时跟踪日志文件新增内容,例如:
tail -f app.log
- 使用 journalctl 查看由 systemd 托管的服务日志,例如:
journalctl -u your-node-service -f
- 文本检索与处理
- 使用 grep 按关键词筛选,例如:
grep "ERROR" app.log
- 使用 awk 提取字段,例如:
awk '{print $1, $2}' app.log
- 使用 sed 做文本替换或提取
- JSON 日志解析
- 使用 jq 解析与查询结构化日志,例如:
jq '.error' app.log;安装:sudo apt-get install jq
- 适用场景
二 Node.js 日志库与输出规范
- 常用日志库
- Winston:多级别、多传输(Console/File/HTTP 等)、支持结构化日志
- Pino:高性能、低开销、可配合流处理
- Morgan:HTTP 请求日志中间件,适合记录接口访问
- log4js:灵活的级别与布局配置
- 输出建议
- 统一使用结构化格式(如 JSON),便于检索与聚合
- 规范字段:timestamp、level、message、requestId、userId、error.stack 等
- 合理设置日志级别:debug/info/warn/error/fatal
- 快速示例(Winston)
- 安装:
npm install winston
- 配置:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('Server started', { port: 3000 });
logger.error('DB connection failed', { err: err.message });
- 适用场景
三 集中式日志平台
- ELK Stack(Elasticsearch + Logstash + Kibana)
- 能力:日志采集、处理、存储、检索与可视化;适合复杂查询与大规模环境
- 接入:在 Node.js 中使用 Winston 等将日志发送至 Elasticsearch,通过 Kibana 构建可视化面板
- Graylog
- PM2 内置日志管理
- 能力:进程守护、日志聚合与日志轮换;常用命令:
pm2 start app.js、pm2 logs myapi
- 适用场景
- 多服务、多实例的生产环境;需要统一检索、可视化与告警
四 监控与可视化指标
- Prometheus + Grafana
- 采集应用指标(如请求时延、活跃请求、内存使用等),在 Grafana 中构建仪表盘
- Node.js 侧可使用 prom-client 暴露指标端点,结合 PM2 或容器编排进行采集
- 适用场景
五 选型建议与快速上手
- 规模与复杂度
- 单机或少量服务:优先用 Winston/Pino + tail/grep/jq 做本地分析
- 多服务/多环境:引入 ELK 或 Graylog 做集中式管理
- 日志形态
- 非结构化文本:先用 grep/awk/sed 处理;结构化 JSON:优先 jq 与 Kibana 检索
- 快速排查命令清单
- 实时看错误:
tail -f app.log | grep --line-buffered ERROR
- JSON 错误字段:
jq 'select(.level=="error") | .error' app.log
- systemd 服务日志:
journalctl -u your-node-service -f
- 实践要点
- 统一日志格式与级别;为请求生成 requestId 串联链路
- 配置日志轮转与保留策略,避免磁盘占满
- 敏感信息脱敏后再写入日志与集中平台