Prometheus 监控 Syslog 实战:将无边界的日志流转化为精准时序指标
Syslog 是企业 IT 基础设施中最普遍的日志协议,承载着服务器、网络设备、安全设备的系统事件、认证记录、错误信息等。但传统日志搜索难以回答“每分钟 SSHD 暴力破解次数”或“防火墙拒绝流量趋势”这类时序问题。Prometheus 生态通过 mtail(Google 的轻量级日志提取器)或 grok_exporter,能够从 Syslog 流中实时抓取数据并生成指标,实现日志的“指标化”。本文将带你构建一条从 Syslog 集中到 Prometheus 告警的完整观测链,让日志不再“沉默”。
1. 为什么需要将 Syslog 转为 Prometheus 指标?
- 趋势分析:错误日志的频率变化、认证失败的增长趋势一目了然。
- 精确告警:不再依赖关键字匹配邮件,而是基于速率、阈值告警,误报大大降低。
- 统一可视化:Syslog 指标和 CPU、内存、应用 QPS 放在同一 Grafana 面板,宏观关联。
- 低成本:无需部署 ELK/Splunk 等重日志平台,mtail 仅需数 MB 内存,即可处理百万级日志量。
2. 方案选型:mtail vs grok_exporter vs 其他
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| mtail | Google 出品,专门为 Prometheus 设计;体积小、性能强;支持条件判断、计数器、直方图;程序语法简洁 | 需要学习 mtail 程序语言;不完全兼容 Grok 模式 | 推荐首选,适合持续运行的日志流 |
| grok_exporter | 复用 Logstash Grok 模式,容易上手;可读取文件或标准输入 | 灵活性稍弱,性能略低于 mtail;依赖 Grok 模式调试 | 已有大量 Grok 模式沉淀的团队 |
| cron + textfile | 无需额外守护进程;通过脚本解析日志并写入 *.prom 文件 | 时效性差(分钟级),复杂指标难以实现 | 仅适合低频率或补丁式场景 |
本文将以 mtail 作为核心方案,因为它专为 Prometheus 指标提取而生,且在生产中久经考验。
3. 部署 mtail 并连接 Syslog
3.1 安装 mtail
二进制部署:
# 下载最新版本(以 v3.0.0-rc51 为例)
wget https://github.com/google/mtail/releases/download/v3.0.0-rc51/mtail_3.0.0-rc51_linux_amd64.tar.gz
tar xzf mtail_3.0.0-rc51_linux_amd64.tar.gz
sudo cp mtail /usr/local/bin/
Docker 部署:
docker run -d \
--name mtail \
-v /etc/mtail/progs:/etc/mtail/progs \
-v /var/log/syslog:/var/log/syslog:ro \
-p 3903:3903 \
google/mtail \
-progs /etc/mtail/progs \
-logs /var/log/syslog
默认监听 3903 端口提供指标,通过 http://localhost:3903/metrics 访问。
3.2 配置 Syslog 集中输出
通常我们会将所有服务器的 Syslog 转发到一台中央日志服务器,再由 mtail 分析。常见方法:
- rsyslog 集中化:在中央 rsyslog 服务端配置将所有日志写入
/var/log/syslog或自定义文件。 - 直接监控本地文件:如果只在单机监控,mtail 直接读取
/var/log/syslog(需有读权限)。 - 管道方式:
tail -f /var/log/syslog | mtail -progs ... -logtostderr,但不建议生产使用。
示例: 将多台服务器的 Syslog 通过 UDP/TCP 发送到中央服务器 10.0.0.100,在中央服务器上开启 rsyslog 的 imudp/imtcp 模块,并将所有日志写入 /var/log/remote-syslog.log,然后 mtail 监控该文件。
# 在中央 mtail 服务器的 rsyslog 配置中
$ModLoad imudp
$UDPServerRun 514
*.* /var/log/remote-syslog.log
启动 mtail 监控该文件:
mtail -progs /etc/mtail/progs -logs /var/log/remote-syslog.log -port 3903
4. 编写 mtail 程序提取指标
mtail 使用类似 awk 的语法。我们将创建几个典型程序,放在 /etc/mtail/progs/ 下,文件名以 .mtail 结尾。
4.1 统计 SSH 登录失败(暴力破解检测)
文件:ssh_auth.mtail
counter ssh_failed_attempts_total by host, user
/sshd.*Failed password for (invalid user )?(?P<user>\S+) from (?P<host>\S+)/ {
ssh_failed_attempts_total[host][user]++
}
- 每匹配到一个失败登录,相应
host和user标签的计数器加一。 - 可通过
rate(ssh_failed_attempts_total[1m])计算每分钟暴力破解速率。
4.2 统计服务重启
文件:service_restarts.mtail
counter service_restarts_total by service
/systemd-logind.*New session.*of user root/ {} # 忽略不需要的
/systemd\[1\]: Started (?P<service>\S+)\./ {
service_restarts_total[service]++
}
- 匹配 systemd 的启动日志,累计服务重启次数。
4.3 防火墙拒绝日志
假设防火墙规则将拒绝的包日志发送到 syslog,格式为 kernel: Firewall DROP: IN=eth0 OUT= ... SRC=... DST=...:
counter firewall_drops_total by src_ip
/kernel: Firewall DROP:.*SRC=(?P<src_ip>\S+) / {
firewall_drops_total[src_ip]++
}
4.4 通用错误计数(按设施和严重级别)
Syslog 格式通常为 <PRI>timestamp host process[pid]: message,mtail 可以解析标准格式:
counter errors_total by facility, severity
/^<(?P<pri>\d+)>/ {
severity = str(pri % 8) # 提取严重级别数字
facility = str(pri / 8) # 提取设施数字
errors_total[facility][severity]++
}
以上程序组合后,Prometheus 就能获得 SSH 暴力破解频率、服务重启次数、防火墙拒绝趋势等关键安全与系统指标。
5. 配置 Prometheus 抓取
scrape_configs:
- job_name: 'syslog-mtail'
scrape_interval: 30s
static_configs:
- targets: ['10.0.0.100:3903']
labels:
env: 'production'
重载 Prometheus 后,即可查询 ssh_failed_attempts_total 等指标。
6. Grafana 可视化
由于指标是自定义的,没有现成的“Syslog 通用仪表盘”。建议创建专属看板:
- SSH 暴力攻击面板:使用
rate(ssh_failed_attempts_total[1m])绘制时间序列,并列出 Top 10 攻击源 IP。 - 服务重启图表:统计表格展示各服务重启次数,使用
increase(service_restarts_total[1h])设置阈值着色。 - 防火墙拒绝流量:显示
rate(firewall_drops_total[5m]),按源 IP 聚合。 - 错误日志速率:利用
errors_total按设施和严重级别展示。
你可以将这些面板保存为一个 Dashboard,结合服务器指标(如 node_exporter 的 CPU/内存)同屏展示,实现系统+安全的融合监控。
7. 告警规则实战
groups:
- name: syslog_alerts
rules:
- alert: SSHBruleForceAttack
expr: rate(ssh_failed_attempts_total[1m]) > 5
for: 2m
labels:
severity: warning
annotations:
summary: "SSH 暴力破解攻击,每分钟失败次数 > 5 (IP: {{ $labels.host }})"
- alert: ServiceRestarted
expr: increase(service_restarts_total[5m]) > 0
labels:
severity: info
annotations:
summary: "服务 {{ $labels.service }} 在最近 5 分钟重启"
- alert: FirewallHighDropRate
expr: rate(firewall_drops_total[5m]) > 100
for: 5m
labels:
severity: critical
annotations:
summary: "防火墙拒绝流量过高,源 IP {{ $labels.src_ip }} 被丢弃超过 100/s"
- alert: SyslogErrorSpike
expr: rate(errors_total{severity=~"[34567]"}[10m]) > 10
for: 5m
labels:
severity: critical
annotations:
summary: "Syslog 中错误级别事件速率激增"
8. 进阶:多租户与性能优化
- 多实例日志分离:若管理多套环境,可在 mtail 中定义不同的日志文件路径,Prometheus 通过多个 target 或标签区分。
- 高基数标签控制:避免用
user这种高基数标签直接存储用户名,容易造成指标爆炸。可使用日志采样或只保留攻击源 IP。 - mtail 内存占用:单个 mtail 进程处理 10 万行/秒日志,内存通常在 50-100MB,合理设置
--max_regexp_cache_size等参数。 - 配合 Loki 实现日志回查:mtail 提取指标,原始日志仍可发送到 Loki。在 Grafana 中,点击指标异常时间段可直接链向 Loki 查看详细日志,实现“指标驱动,日志定位”。
9. 安全与运维
- 确保 mtail 只读取日志文件,不修改系统文件,运行用户权限最小化。
- 如果日志中包含敏感数据(如密码),不要直接用明文标签暴露;可以使用
drop或哈希处理。 - 定期检查 mtail 程序的性能,避免无限循环或过于复杂的正则匹配。
- 将 mtail 作为 systemd 服务管理,确保进程存活。
通过 mtail 将 Syslog 转换为 Prometheus 指标,你不仅获得了对系统事件和安全威胁的实时洞察,更让分散的日志数据成为一套可量化、可告警的时序资产。与 node_exporter、应用 exporter 组合,整个 IT 栈从硬件到应用再到安全日志,真正在 Prometheus 的世界里实现了全栈可观测。

407

被折叠的 条评论
为什么被折叠?



