rsyslog 与 prometheus 联动实现日志语义与指标数值互补:rsyslog 结构化采集错误上下文,prometheus 量化异常趋势并联动告警与自动恢复。

rsyslog 和 Prometheus 联动不是简单拼凑,而是让日志的“语义”和指标的“数值”互相补位:rsyslog 捕获错误上下文(比如哪台机器、什么时间、报了什么错),Prometheus 则量化异常趋势(比如 ERROR 日志每分钟激增 50 条、/var/log 磁盘剩余不足 10%)。两者结合,才能既快速定位问题根源,又提前预警潜在风险。
一、用 rsyslog 做结构化日志采集与轻量触发
核心是把原始日志变成可被程序识别的结构,避免靠 grep 碰运气。
- 在所有节点的 /etc/rsyslog.conf 末尾添加 JSON 模板和转发规则:
template(name="json-template" type="list") { property(name="timestamp" dateFormat="rfc3339") constant(value=", \"hostname\":\"") property(name="hostname") constant(value="\", \"level\":\"") property(name="syslogseverity-text") constant(value="\", \"program\":\"") property(name="programname") constant(value="\", \"message\":\"") property(name="msg" format="json") constant(value="\"}\n") }
*.* @central-logger:514;json-template
- 重启服务:systemctl restart rsyslog
- 确保 central-logger 上 Logstash 或 Filebeat 监听 UDP 514,并将字段写入 Elasticsearch 或直接转成 Prometheus 指标(如用 prometheus-log-exporter 工具)
二、用 Prometheus 抓取日志相关关键指标
不只看 CPU 内存,要盯住日志系统自身健康度和日志内容特征。
- 部署 node_exporter 时启用 syslog 模块:./node_exporter --collector.syslog
- 在 Prometheus 的 scrape_configs 中加任务:
- job_name: 'syslog-metrics'
static_configs:
- targets: ['192.168.1.10:9100']
metrics_path: /metrics
params:
collect[]: ['syslog']
- 重点采集指标:syslog_messages_total{level="err", program="nginx"}(按级别+程序统计)、node_filesystem_avail_bytes{mountpoint="/var/log"}(日志盘剩余空间)、journal_entries_total(单位时间新日志条数)
三、告警规则联动恢复动作
告警不只是发邮件,要能自动干预。
- 在 Prometheus alert.rules 中定义:
ALERT SyslogErrorBurst
IF rate(syslog_messages_total{level="err"}[5m]) > 10
FOR 2m
LABELS { severity="critical" }
ANNOTATIONS { summary = "ERR 日志突增", description = "主机 {{ $labels.instance }} 近5分钟 ERR 日志超10条/秒" }
- Alertmanager 配置 webhook,指向一个轻量 HTTP 服务(如 Python Flask)
- 该服务收到告警后执行:journalctl -u nginx --since "10 minutes ago" | grep -i "connection refused" | head -5 快速提取上下文,并调用 systemctl restart nginx 或清理磁盘 journalctl --vacuum-size=100M
四、故障时的双向验证机制
避免“告警响了但没修好”或“修好了但还在告警”。
- 恢复脚本执行后,主动上报状态指标到 Prometheus:echo "recovery_status{service=\"nginx\", result=\"success\"} 1" | nc -u -w1 prometheus-pushgateway:9091
- Prometheus 新增一条规则:若 recovery_status == 1 且 syslog_messages_total{level="err"} 持续 3 分钟,则自动关闭对应告警
- 同时在 rsyslog 配置中加一条本地规则::msg, contains, "recovered" /var/log/recovery.log,用于人工复核自动化动作是否真正生效










