rsyslog可实时提取error/warn/failed等日志关键词写入管道,mtail监听该管道并用正则匹配计数,暴露为prometheus指标;prometheus通过rate()计算错误频次并告警,全程无中间存储,轻量高效。

可以通过 rsyslog 将日志中的错误/告警关键词(如 ERROR、WARN、Failed)实时提取并计数,再由 mtail-exporter(注意:正确名称是 mtail,非 mtcall)将计数暴露为 Prometheus 可采集的指标。整个链路无需中间存储,实现轻量级日志频次监控。
1. 用 rsyslog 提取关键日志行并写入专用管道文件
rsyslog 支持基于模板和条件过滤,将匹配错误模式的日志写入 FIFO(命名管道),供 mtail 实时读取:
- 在 /etc/rsyslog.d/99-error-monitor.conf 中添加:
module(load="imfile" PollingInterval="1")
module(load="ompipe")
<p>template(name="errorOnly" type="string" string="%msg%\n")</p><p>if $msg contains "ERROR" or $msg contains "WARN" or $msg contains "Failed" or $msg contains "Exception" then {
action(type="ompipe" pipe="/var/log/error_pipe" template="errorOnly")
stop
}</p>
- 创建命名管道:
mkfifo /var/log/error_pipe(确保 mtail 启动前存在) - 重启 rsyslog:
systemctl restart rsyslog
2. 编写 mtail 程序对管道日志做行级匹配与计数
mtail 会持续监听管道,每匹配一行就递增对应指标。新建 /etc/mtail/error_counter.mtail:
counter error_count by level
counter warn_count by level
<p>/ERROR/ {
error_count["default"] += 1
}
/WARN/ {
warn_count["default"] += 1
}
/Failed.<em>connection|timeout|refused/ {
error_count["network"] += 1
}
/Exception.</em>NullPointerException/ {
error_count["java_null"] += 1
}</p>
- 支持正则分组、标签维度(如
level)、多指标定义 - 避免使用过于宽泛的正则(如
.*),防止误匹配或性能下降
3. 启动 mtail 并配置 Prometheus 抓取
以守护进程方式运行 mtail,监听管道并暴露 HTTP metrics 接口:
- 启动命令(建议用 systemd 管理):
mtail -progs /etc/mtail/ -logs /var/log/error_pipe -port 9191 -v 0
- 验证指标是否生成:
curl http://localhost:9191/metrics | grep error_count应返回类似error_count{level="network"} 12 - 在 Prometheus prometheus.yml 中添加 job:
scrape_configs: - job_name: 'mtail-errors' static_configs: - targets: ['localhost:9191']
- 重载 Prometheus:
curl -X POST http://localhost:9090/-/reload(需启用 --web.enable-admin-api)
4. 在 Prometheus 中查询与告警(示例)
利用计数器的增量特性,计算单位时间错误频次:
- 过去 5 分钟每秒 ERROR 出现次数:
rate(error_count{level="default"}[5m]) - 网络类失败突增(对比基线):
rate(error_count{level="network"}[10m]) > 0.5 - 配置 Alertmanager 告警规则,例如当 Java 空指针 1 分钟内超 3 次:
rate(error_count{level="java_null"}[1m]) > 3










