巧用Categraf探针mtail插件实现系统日志监控告警

介绍使用 Categraf 的 mtail 插件把系统日志异常转换为指标,再接入夜莺告警的轻量级方案,并给出 /var/log/messages 中 10 类严重系统错误的 mtail 规则示例。

作者 李沈阳@海信

系统日志告警的目标,不一定是把所有原始日志都集中存储后再查询。对于内核 panic、OOM、Call Trace、Hardware Error 这类稳定且严重的系统日志模式,更轻量的做法是:在机器本地用 mtail 把日志模式转换成指标,再把指标交给夜莺做告警。

核心要点

  • ELK、Kafka、Flink 等方案适合做统一日志存储和复杂分析,但链路较长,建设和维护成本也更高。
  • 系统日志的严重异常模式相对稳定,可以用正则匹配并转换成 counter 指标。
  • Categraf 已经集成 mtail 插件,可以在本地读取 /var/log/messages,把匹配到的系统错误上报为监控指标。
  • 这种方案不传输原始日志,适合做轻量级、实时性更好的系统异常告警;如果需要全文检索和审计,仍然需要日志平台。

为什么用 mtail 做系统日志告警

目前市面上对于日志监控告警的主流方案主要围绕ELK及其变种展开,通过探针采集系统日志写入Kafka,然后基于Kakfa消费数据写入ES,采用定时查询ES 做异常告警;另一种方案则是基于Kafka流式数据,采用Flink直接做异常告警。

这种方式好处就是日志实现了统一存储,查询分析会更方便。而告警方面,定时查询,会存在告警时间实时性存在误差;如果基于Flink实现告警,有利于更复杂方案的告警,且初始搭建成本较高。同时网络传输日志的网络代价也不容易忽略,尤其是网络带宽占用随日志量波动。

相对于应用日志的差异性,系统日志则更趋向于稳定。对于系统日志,只要系统不发生严重异常,则几乎不需要关注。因此,对于系统异常进行归类整理,通过将日志异常指标化,是可以满足系统异常告警要求的。同时这种方式,对系统日志实时监控,不进行原始日志传输,二次存储,告警实时性而以保证,对于网络也是一种稳定的负载。

更为重要的是,目前夜莺推荐探针Categraf 已经集成了google的mtail(日志指标化)插件,我们只需要按照Categraf 探针,并配置mtail插件启用日志监控,即可将异常指标采集,轻松送到夜莺服务端,进而复用夜莺告警能力,实现轻量化的日志告警。

这个方案的边界也要说清楚:mtail 适合把稳定模式转换成指标,不适合替代日志检索系统。排查时如果需要查看原始上下文,仍然要回到机器日志或集中日志平台。

配置 Categraf mtail 插件

以下是我们整理的日志告警mtail 配置,share 如下,包括10中系统严重错误告警,供各位参考,Enjoy:

input.mtail/mtail.toml内容如下:

[[instances]]
progs = "/usr/local/categraf/conf/input.mtail/progs/"
logs = ["/var/log/messages"]
override_timezone = "Asia/Shanghai"

这段配置表达了三件事:progs 指向 mtail 规则文件目录,logs 指定要读取的系统日志文件,override_timezone 指定时区。实际环境中日志路径可能不是 /var/log/messages,需要按操作系统和日志配置调整。

十类严重系统错误规则

十种严重系统错误的正则化检测文件配置如下,这是本文的重点:

# file BlockForMore.mtail:
counter system_blocked_morethan_error
/blocked for more than/ {
 system_blocked_morethan_error++
}

# file BUGHardareLookup.mtail:
counter system_hardlookup_bug
/Hard LOCKUP/ {
 system_hardlookup_bug++
}

# file BUGSoftLookup.mtail:
counter system_softlookup_bug
/BUG: soft lockup/ {
 system_softlookup_bug++
}

# file CallTrace.mtail:
counter system_call_trace_error
/Call Trace/ {
  system_call_trace_error++
}

# file HardwareError.mtail:
counter system_hardware_error
/Hardware Error/ {
 system_hardware_error++
}

# file KernelBug.mtail:
counter system_kernel_bug
/kernel BUG at/ {
 system_kernel_bug++
}

# file KernelPanic.mtail:
counter system_kernel_panic_error
/Kernel panic/ {
 system_kernel_panic_error++
}

# file MemoryCgroupOutOfMemory.mtail:
counter cgroup_out_of_memory_error
/Memory cgroup out of memory/ {
  cgroup_out_of_memory_error++
}

# file OutOfMemory.mtail:
counter system_out_of_memory_error
/Out of memory/ {
  system_out_of_memory_error++
}

# file UnableHandleKernel.mtail:
counter system_unable_handle_kernel_error
/BUG: unable to handle kernel/ {
 system_unable_handle_kernel_error++
}

这些规则全部使用 counter 类型。每匹配到一次对应日志,指标就自增一次。告警规则可以基于单位时间增量来配置,例如观察最近几分钟是否出现新增错误。具体窗口和阈值要结合主机规模、日志噪声和告警等级调整。

指标与告警建议

mtail 指标 匹配日志模式 适合关注的问题
system_blocked_morethan_error blocked for more than 任务长时间阻塞
system_hardlookup_bug Hard LOCKUP CPU 或内核层面严重卡死信号
system_softlookup_bug BUG: soft lockup soft lockup 异常
system_call_trace_error Call Trace 内核调用栈异常
system_hardware_error Hardware Error 硬件错误
system_kernel_bug kernel BUG at 内核 BUG
system_kernel_panic_error Kernel panic 内核 panic
cgroup_out_of_memory_error Memory cgroup out of memory cgroup OOM
system_out_of_memory_error Out of memory 系统 OOM
system_unable_handle_kernel_error BUG: unable to handle kernel 内核无法处理异常

落地注意事项

  1. 先确认日志路径。不同系统可能使用 /var/log/messages/var/log/syslog 或 journald。
  2. 先用小范围机器验证规则,确认正则不会误匹配大量普通日志。
  3. 告警建议基于增量,而不是 counter 原始值。
  4. 对于 Kernel panic、OOM、Hardware Error 这类严重信号,可以配置更高等级告警。
  5. mtail 指标只能告诉你出现了某类日志,根因排查仍需要查看原始日志上下文。

FAQ

Q1:mtail 方案能替代 ELK 吗? A:不能完全替代。mtail 适合把稳定日志模式转成指标做告警;ELK 类平台更适合集中存储、全文检索和复杂分析。

Q2:为什么系统日志适合指标化? A:相对应用日志,系统日志里的严重异常模式更稳定,例如 OOM、Kernel panic、Call Trace,因此可以用正则归类并转换成 counter 指标。

Q3:告警应该看 counter 原始值还是增量? A:建议看单位时间增量。counter 原始值会持续累加,直接告警容易误判;观察最近几分钟是否新增错误更符合告警语义。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 Categraf mtail
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云