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 i pino;开发环境可用 pino-pretty 输出到控制台)。
- 输出到系统日志:便于统一采集与审计。示例(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。
二 systemd 与日志轮转
- 使用 systemd 管理并接入日志:
- 创建服务文件:/etc/systemd/system/myapp.service
- [Service]
- ExecStart=/usr/bin/node /path/to/app.js
- WorkingDirectory=/path/to/app
- User=youruser
- Group=yourgroup
- StandardOutput=journal
- StandardError=journal
- SyslogIdentifier=myapp
- 生效与查看:sudo systemctl daemon-reload;sudo systemctl start myapp;sudo journalctl -u myapp -f
- 说明:写入 journald 时,由 journald 负责日志轮转与持久化,无需额外 logrotate 配置。
- 文件日志的轮转与保留(适用于写入文件的场景):
- 新建配置:/etc/logrotate.d/nodejs
- /path/to/your/nodejs/app/*.log {
- daily
- missingok
- rotate 7
- compress
- notifempty
- create 0640 root adm
- }
- 测试:sudo logrotate -f /etc/logrotate.d/nodejs。
三 实时监控与快速筛选
- 实时查看服务日志:sudo journalctl -u your-nodejs-app.service -f
- 按时间筛选:sudo journalctl -u your-nodejs-app.service --since “2025-11-01” --until “2025-11-20”
- 文件日志关键字检索:grep -i “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 延迟、进程重启次数等指标设置阈值告警,形成“日志 + 指标”的闭环。
- 轻量方案(无需大规模平台):
- 使用 Monit 对日志文件变化与阈值进行监控并告警(如文件大小超过阈值触发邮件)。示例要点:
- check file nodeapp with path /var/log/nodeapp.log
- if size > 100KB then alert
- 邮件通知:set mailserver smtp.example.com port 587;set alert your-email@example.com。