Node.js日志Ubuntu中如何实现自动化管理
小樊
37
2025-12-19 21:26:06
Ubuntu 上 Node.js 日志自动化管理
一 架构与总体思路
- 统一输出:将 Node.js 日志打印到stdout/stderr,便于由 systemd 集中采集;或使用日志库写入文件并配合轮转。
- 集中采集与轮转:用 systemd journald 或 rsyslog/syslog-ng 收集,文件日志用 logrotate 做按日/按大小轮转与压缩。
- 长期存储与分析:将日志送入 ELK(Elasticsearch + Logstash + Kibana) 或 Prometheus + Grafana 做检索、可视化与告警。
- 自动化清理:通过 logrotate 的保留策略或 systemd timer/cron 定期删除过期日志,控制磁盘占用。
二 采集与轮转配置
- 使用 systemd 托管与采集
- 创建服务单元:/etc/systemd/system/nodejs-app.service
- 关键项:将日志输出到控制台(journald 会捕获),设置 Restart=always 保证稳定性。
- 示例要点:
- ExecStart=/usr/bin/node /path/to/app.js
- StandardOutput=journal
- StandardError=journal
- Restart=always
- 查看与跟踪日志:
- 实时查看:journalctl -u nodejs-app -f
- 按时间筛选:journalctl -u nodejs-app --since “2025-12-19 00:00:00”
- 使用 logrotate 做文件轮转
- 新建配置:/etc/logrotate.d/nodejs-app
- 示例:
- /var/log/nodejs/*.log {
- daily
- missingok
- rotate 7
- compress
- notifempty
- create 0640 root adm
- copytruncate
- }
- 说明:
- daily/rotate 7/compress 控制保留周期与压缩;
- copytruncate 适用于持续写入的文件,避免应用重开文件句柄(若应用支持 reopen 信号,也可用 postrotate 执行 kill -USR1)。
- 手动测试与生效:
- 测试:sudo logrotate -d /etc/logrotate.d/nodejs-app(干跑)
- 强制执行:sudo logrotate -f /etc/logrotate.d/nodejs-app
- 直接在 Node.js 内做轮转(可选)
- 使用 winston-daily-rotate-file 或 pino-rotate 在应用内按天/按大小切分与压缩,适合容器或无 systemd 场景。
三 集中分析与告警
- 搭建 ELK 做检索与可视化
- 安装 Elasticsearch、Logstash、Kibana(示例为 7.x 源):
- 添加 GPG 与源后 apt 安装 elasticsearch、logstash、kibana
- 启动并设为开机自启:sudo systemctl enable --now elasticsearch kibana
- Logstash 采集文件日志示例(/etc/logstash/conf.d/nodejs.conf):
- input { file { path => “/var/log/nodejs/*.log” start_position => “beginning” } }
- filter { } # 可按需解析 JSON、grok
- output { elasticsearch { hosts => [“localhost:9200”] index => “nodejs-logs-%{+YYYY.MM.dd}” } }
- 在 Kibana 中创建索引模式与可视化仪表板,实现错误趋势、响应时延等分析。
- 错误告警与报表自动化
- 简单报表脚本(示例):统计 ERROR 并邮件发送
- grep “ERROR” /var/log/nodejs/error.log | awk ‘{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10}’ > error_report.txt
- mail -s “Node.js Error Report” your_email@example.com < error_report.txt
- 定时执行:
- crontab -e 加入:0 0 * * * /path/to/report.sh
- 指标与可视化:
- 结合 Prometheus 抓取 Node.js 指标(如 prom-client),在 Grafana 配置面板与阈值告警。
四 自动化清理策略
- 推荐优先使用 logrotate 的保留策略(见上文),无需额外清理任务。
- 使用 systemd timer 定期清理(适合与 systemd 生态统一运维)
- 清理脚本:/usr/local/bin/clean-nodejs-logs.sh
- #!/bin/bash
- LOG_DIR=“/var/log/nodejs”
- find “$LOG_DIR” -type f -name “*.gz” -mtime +7 -delete
- find “$LOG_DIR” -type f -name “*.log” -mtime +30 -delete
- 赋权:chmod +x /usr/local/bin/clean-nodejs-logs.sh
- 定时器:/etc/systemd/system/clean-nodejs-logs.timer
- [Unit] Description=Clean Node.js logs older than 7/30 days
- [Timer] OnCalendar=daily Persistent=true
- [Install] WantedBy=timers.target
- 服务:/etc/systemd/system/clean-nodejs-logs.service
- [Service] ExecStart=/usr/local/bin/clean-nodejs-logs.sh
- 启用:systemctl daemon-reload && systemctl enable --now clean-nodejs-logs.timer
- 使用 cron 定时清理(通用方案)
- 每天清理 7 天前的 .gz:0 2 * * * find /var/log/nodejs -type f -name “*.gz” -mtime +7 -delete
- 每 30 天清理原始 .log:0 3 * * * find /var/log/nodejs -type f -name “*.log” -mtime +30 -delete
五 落地检查清单
- 日志路径与权限:确保应用对日志目录有写权限,systemd 服务 User/Group 与目录属主匹配。
- 轮转验证:执行 logrotate 干跑与强制执行,确认旧日志被压缩、按策略保留,应用无写入异常。
- 采集链路:journald 或 rsyslog 能正确接收;ELK 索引按天创建、Kibana 可检索到最新日志。
- 告警验证:在 Grafana/Prometheus 或日志报表脚本中制造测试事件,确认告警触发与通知正常。
- 容量评估:结合保留周期与磁盘容量,合理设置 rotate 天数 与 maxFiles,并定期审计。