Prometheus 监控 Syslog 实战:将无边界的日志流转化为精准时序指标

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 其他

方案优点缺点适用场景
mtailGoogle 出品,专门为 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]++
}
  • 每匹配到一个失败登录,相应 hostuser 标签的计数器加一。
  • 可通过 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 的世界里实现了全栈可观测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值