Debian 上基于 Node.js 日志的监控实操指南
一 日志采集与输出
- 应用内结构化日志:使用成熟的日志库输出JSON便于检索与聚合。示例(Winston):
- 安装:
npm install winston
- 配置:
- const winston = require(‘winston’);
- const logger = winston.createLogger({
- level: process.env.LOG_LEVEL || ‘info’,
- format: winston.format.json(),
- transports: [
- new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
- new winston.transports.File({ filename: ‘combined.log’ })
- ]
- });
- if (process.env.NODE_ENV !== ‘production’) logger.add(new winston.transports.Console({ format: winston.format.simple() }));
- 也可选 Pino(高性能):
npm install pino,配合 pino.destination 写文件,开发环境输出到控制台。
- 输出到系统日志:便于统一采集与审计。示例(Winston + syslog):
- 安装:
npm install winston winston-syslog
- 使用:在 transports 中加入
new winston.transports.Syslog({ host: '127.0.0.1', port: 514, protocol: 'udp' });或用 pino-syslog。
- 使用进程管理器:如 PM2 内置日志聚合与查看:
pm2 start app.js --name my-app,pm2 logs my-app,pm2 monit。
二 日志轮转与保留策略
- 使用 logrotate 防止日志无限增长(适用于文件日志):
- 安装:
sudo apt install logrotate
- 新建配置:
/etc/logrotate.d/nodejs
- /path/to/your/nodejs/app/*.log {
- daily
- missingok
- rotate 7
- compress
- notifempty
- create 0640 root adm
- }
- 说明:按天轮转、保留7天、压缩旧日志、自动创建新文件并设置权限。
- 若日志写入 journald(如通过 systemd 的 StandardOutput=journal),由 journald 负责日志轮转与持久化,无需额外 logrotate 配置。
三 实时查看与快速筛选
- 查看 systemd 服务日志:
sudo journalctl -u your-nodejs-app.service -f(实时跟踪);按时间筛选:sudo journalctl -u your-nodejs-app.service --since "2025-11-01" --until "2025-11-20"。
- 查看文件日志:
tail -f /var/log/nodejs/*.log;关键词检索:grep "error" /var/log/nodejs/*.log;必要时查看系统日志:/var/log/syslog、/var/log/messages。
- 使用 PM2 实时查看:
pm2 logs my-app(支持按应用名过滤与多实例合并)。
四 集中化监控与告警
- 集中式日志平台:
- ELK Stack(Elasticsearch + Logstash + Kibana):收集、解析、存储与可视化日志,适合复杂查询与可视化分析。
- Graylog:集中日志管理、强大检索与告警能力。
- Fluentd:统一日志采集与转发,可对接 ES、Loki 等后端。
- 指标与可视化(与日志互补):
- Prometheus + Grafana:暴露 Node.js 指标(如 HTTP 延迟、错误率、内存/CPU),在 Grafana 构建仪表盘并设置告警规则。
- 第三方 APM(如 New Relic、Datadog、AppDynamics):深入性能监控与分布式追踪,可与日志联动定位问题。
五 异常监控与告警落地
- 日志异常检测思路:
- 在应用内统一使用日志级别(error/warn/info/debug),对异常与关键路径打点;将 error 单独写入
error.log 便于快速定位。
- 在集中式平台(如 ELK/Graylog/Fluentd)配置关键字告警(如 “error”、“Exception”、“timeout”、“5xx”)与速率告警(如 5xx/分钟突增)。
- 结合 Prometheus 对错误率、P95/P99 延迟、进程重启次数等指标设置阈值告警,形成“日志 + 指标”的闭环。
- 快速命令清单(示例):
- 实时跟踪服务日志:
sudo journalctl -u myapp -f
- 检索最近 1 小时 error:
sudo journalctl -u myapp --since "1 hour ago" | grep -i error
- 文件日志关键字:
grep -i "timeout" /var/log/nodejs/*.log
- 查看 PM2 日志:
pm2 logs myapp --lines 200。