ELK、Loki、Kafka 三种日志告警联动方案全解析(附实战 Demo)


网罗开发 (小红书、快手、视频号同名)

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。

📅 最新动态:2025 年 3 月 17 日

快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!

文章目录

    • 摘要
    • 引言
    • [ELK + Watcher:老牌告警组合](#ELK + Watcher:老牌告警组合)
      • [什么是 Watcher?](#什么是 Watcher?)
      • [Demo:只要日志里出现 ERROR,马上发邮件告警](#Demo:只要日志里出现 ERROR,马上发邮件告警)
        • 前置条件
        • [Watcher 创建脚本(可通过 Kibana Dev Tools 执行)](#Watcher 创建脚本(可通过 Kibana Dev Tools 执行))
    • [Loki + Promtail + Alertmanager:现代云原生方案](#Loki + Promtail + Alertmanager:现代云原生方案)
      • 为什么推荐?
      • [Loki 示例配置](#Loki 示例配置)
      • [Alertmanager 配置(钉钉)](#Alertmanager 配置(钉钉))
    • [Kafka + 日志消费 + 自定义告警](#Kafka + 日志消费 + 自定义告警)
  • 真实场景案例:生产支付服务异常自动提醒
    • [QA 环节](#QA 环节)
      • [Q1: 日志告警太频繁怎么办?](#Q1: 日志告警太频繁怎么办?)
      • [Q2: 告警能包含堆栈信息吗?](#Q2: 告警能包含堆栈信息吗?)
      • [Q3: 可以指定某些服务日志不告警吗?](#Q3: 可以指定某些服务日志不告警吗?)
    • 总结

摘要

我们经常遇到这样的场景:生产环境系统出问题了,日志早就写好了报错信息,但团队没人知道。系统看起来"运行正常",其实用户早就被 Bug 打败了。这篇文章会从实战角度出发,介绍如何将日志系统与告警通道打通:让日志真正"叫得出声",第一时间触发钉钉、邮箱、短信等渠道告警。

引言

随着微服务架构的普及,一个用户请求背后可能跨越十几个服务节点。我们在每个节点记录日志,但如果没有统一的监控和告警机制,这些日志就像写在墙上的涂鸦------没人看,也没人管。

现代的日志系统已经不再是"写到文件里就完事",它应该是系统可观测性的一部分。我们可以通过:

  • ELK + Watcher 实现日志字段级触发
  • Loki + Promtail + Prometheus + Alertmanager 实现 Grafana 风格日志告警
  • Kafka 日志流 + 实时消费 + 条件匹配触发钉钉机器人

下面,我们从简单到复杂,逐一讲解实现方式。

ELK + Watcher:老牌告警组合

什么是 Watcher?

Watcher 是 Elasticsearch 的一款 X-Pack 插件,用于监控数据变动并触发行为。可以设定日志字段中的关键字(如"ERROR"、"OutOfMemory"),超过阈值或出现即触发告警。

Demo:只要日志里出现 ERROR,马上发邮件告警

前置条件
  • 已搭建好 ELK(Filebeat → Logstash → Elasticsearch → Kibana)
  • Kibana 中可以搜索到 ERROR 日志
Watcher 创建脚本(可通过 Kibana Dev Tools 执行)
json 复制代码
PUT _watcher/watch/error_alert_watch
{
  "trigger": {
    "schedule": {
      "interval": "1m"
    }
  },
  "input": {
    "search": {
      "request": {
        "indices": ["logstash-*"],
        "body": {
          "query": {
            "match": {
              "message": "ERROR"
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total.value": {
        "gt": 0
      }
    }
  },
  "actions": {
    "send_email": {
      "email": {
        "to": "ops@example.com",
        "subject": "日志告警:发现 ERROR 日志",
        "body": "请检查系统日志,发现 ERROR 报错。"
      }
    }
  }
}

Loki + Promtail + Alertmanager:现代云原生方案

为什么推荐?

Loki 是 Grafana 推出的日志系统,支持 PromQL 查询语法,轻量级、原生支持日志与指标结合,配合 Alertmanager 可直接推送钉钉、微信、邮件等。

Loki 示例配置

Promtail 收集日志 → Loki 聚合 → Alertmanager 告警

yaml 复制代码
groups:
- name: error-logs
  rules:
  - alert: AppErrorLog
    expr: count_over_time({job="app"} |= "ERROR"[1m]) > 0
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "发现 ERROR 日志"
      description: "服务出现错误日志,请立即检查。"

Alertmanager 配置(钉钉)

yaml 复制代码
receivers:
- name: dingtalk
  webhook_configs:
    - url: 'https://oapi.dingtalk.com/robot/send?access_token=xxx'

可以结合 Webhook 转换器(如 dingtalk-webhook-adapter)将 Prometheus 告警转为钉钉格式。

Kafka + 日志消费 + 自定义告警

什么场景适合?

适用于日志量超大、不适合用全文索引系统查询的情况,比如:

  • 高频日志(百万级)
  • 特殊告警逻辑(非简单字符串匹配)

实现思路

  1. 所有服务日志通过 Filebeat 发送到 Kafka
  2. 编写一个 Node.js 或 Python 消费者
  3. 识别日志中的关键词(如"OutOfMemory"、"user_id=0"等)
  4. 匹配即触发钉钉/邮件告警
Node.js Kafka 消费 + 钉钉推送示例
js 复制代码
const { Kafka } = require('kafkajs');
const axios = require('axios');

const kafka = new Kafka({ clientId: 'log-alert', brokers: ['localhost:9092'] });
const consumer = kafka.consumer({ groupId: 'log-alert-group' });

(async () => {
  await consumer.connect();
  await consumer.subscribe({ topic: 'logs', fromBeginning: false });

  await consumer.run({
    eachMessage: async ({ message }) => {
      const log = message.value.toString();
      if (log.includes('ERROR') || log.includes('OutOfMemory')) {
        await axios.post('https://oapi.dingtalk.com/robot/send?access_token=xxx', {
          msgtype: 'text',
          text: { content: `日志告警:${log}` }
        });
      }
    },
  });
})();

真实场景案例:生产支付服务异常自动提醒

场景:

支付服务日志中记录了一个字段 payment_status = failed,但因为日志没被及时处理,业务侧连续丢单 20 分钟。

解决方案:

  • 将日志聚合到 Loki
  • 使用如下 PromQL 规则
promql 复制代码
count_over_time({app="payment"} |= "payment_status=failed"[5m]) > 10
  • 超过 10 条记录就触发钉钉告警,精度达到分钟级别,从"事后补救"升级为"实时自愈"

QA 环节

Q1: 日志告警太频繁怎么办?

A: 可以通过设置 抖动时间(for: 5m)分组告警(group_by)聚合告警(count > N) 降低骚扰频率。

Q2: 告警能包含堆栈信息吗?

A: 可以。ELK 中 watcher 动作支持引用字段,Loki 支持 line_format,Kafka 消费者也可以截取关键字段作为告警内容。

Q3: 可以指定某些服务日志不告警吗?

A: 可以通过正则或标签过滤,比如:

promql 复制代码
{job!="dev"} |= "ERROR"

避免开发环境日志触发告警。

总结

日志不止用来看,更重要的是"能触发",也就是我们说的日志驱动告警系统。只要你把日志打得够规范,后续无论是用 Watcher、Loki 还是 Kafka,都能帮你实现实时响应的问题发现体系。

相关推荐
橘子在努力1 小时前
【橘子分布式】Thrift RPC(理论篇)
分布式·网络协议·rpc
lifallen3 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
沈健_算法小生6 小时前
基于SpringBoot3集成Kafka集群
分布式·kafka·linq
小凯 ོ7 小时前
ELK 使用教程采集系统日志
elk·日志
chanalbert15 小时前
Nacos 技术研究文档(基于 Nacos 3)
spring boot·分布式·spring cloud
线条116 小时前
Spark 单机模式安装与测试全攻略
大数据·分布式·spark
C182981825751 天前
分布式ID 与自增区别
分布式
码字的字节1 天前
深入解析Hadoop架构设计:原理、组件与应用
大数据·hadoop·分布式·hadoop架构设计
悟能不能悟1 天前
Dubbo跨越分布式事务的最终一致性陷阱
分布式·wpf·dubbo