中文 English

别再人工翻日志了:ELK 三件套接入 AI Agent,从部署到自动排障的手把手教程

发布时间: 2026-07-11
ELK Elasticsearch Logstash Kibana AI Agent MCP 可观测性

ELK 三件套接入 AI Agent 题图

过去,线上报警后的标准动作通常是:打开 Kibana、选择时间范围、输入查询语句、翻几十页日志、复制错误堆栈,再把零散证据拼成结论。系统一多,这件事很像在一座没有导购员的巨大仓库里找一颗螺丝。

现在可以换一种方式:让 ELK 继续负责可靠地收集、整理和搜索日志,再给它加一座 MCP “翻译桥”,让 AI Agent 用工具读取证据。于是你可以直接问:

最近 15 分钟哪个服务的 5xx 最多?请列出证据、关联 trace_id,并给出下一步排查建议。

Agent 不再只靠语言模型“猜”,而是先调用 Elasticsearch 查询,再根据返回的数据组织答案。本文不是概念拼贴。我实际启动了 Elasticsearch、Logstash、Kibana 和 Elasticsearch MCP Server,导入一组脱敏故障日志,完成 MCP 协议握手与查询,并记录了中途踩到的权限问题。

先说结论:真正有价值的不是“让 AI 看日志”,而是让它有边界地查日志

接入后的合理架构是:

这与“把所有日志复制给聊天机器人”完全不同。后者既容易泄密,也会受上下文长度限制;前者让数据留在自己的 ELK 中,Agent 只取当前问题需要的少量结果。

ELK 像一座会说话的图书馆

如果给小学生解释,可以把它想成一座图书馆:Logstash 是收书和贴标签的工作人员,Elasticsearch 是记住每本书放在哪里的图书管理员,Kibana 是墙上的查询大屏,MCP 是翻译员,AI Agent 是会帮你办事的值班同学。你问“哪一类事故最多”,值班同学不会凭印象回答,而是让翻译员去问图书管理员,然后把查到的书名和页码一起交给你。

ELK 三件套到底是什么

Elasticsearch:不是数据库替代品,而是搜索与分析引擎

Elasticsearch 将文档建立倒排索引,擅长全文检索、时间范围过滤、多条件查询和聚合统计。日志场景中,一条日志通常是一份 JSON 文档,包含时间、服务、级别、消息、状态码、耗时、链路标识等字段。

它最像一本超级厚的词典。普通数据库像按页码翻书;倒排索引则像先做“关键词 → 出现位置”的目录。因此当日志达到百万甚至亿级时,仍然可以快速回答“过去 10 分钟 payment 服务出现了多少次 504”。

Logstash:日志流水线上的分拣员

Logstash 的核心是 input、filter、output:从哪里收、如何处理、送到哪里。它可以读取文件、TCP、消息队列等输入,把非结构化文本解析成字段,删除敏感信息,统一时间格式,再写入 Elasticsearch。

实际生产环境中,Agent 好不好用,很大程度取决于这里的数据质量。如果所有信息都塞在 message 字符串中,Agent 只能模糊搜索;如果提前拆成 servicelevelstatus_codeduration_mstrace_id,它就能做精确统计和关联分析。

Kibana:人类仍然需要的驾驶舱

Kibana 提供 Discover、Dashboard、ES|QL、索引管理和告警等能力。接入 Agent 并不意味着 Kibana 可以删除。恰恰相反,Kibana 是人工复核 Agent 结论的重要窗口:Agent 说错误集中在某个服务,你应该能在 Discover 中用相同条件看到相同结果。

为什么以前的“日志 + 大模型”方案经常不好用

常见失败方式有四种。

第一种是把几百 KB 甚至几 MB 日志直接粘进对话框。模型上下文会被重复字段和无关 INFO 日志占满,重要错误反而被淹没。

第二种是只做向量检索。向量搜索适合“意思相近”,但“状态码等于 504”“最近 15 分钟”“按服务分组”更适合结构化过滤和聚合。日志分析应该结合全文搜索、Query DSL、ES|QL 与必要的语义检索,而不是只用一种锤子。

第三种是给 Agent 一个权限过大的 Elasticsearch 超级账号。这样它不仅能查,还可能误删索引、修改模板。自动化越强,权限边界越重要。

第四种是没有证据链。只输出“可能是连接池问题”不够,可靠答案至少应包含时间范围、索引、查询条件、命中数量、代表性日志和不确定性。

本文的真实实验:从日志文件到 Agent 工具调用

本次实验使用 Elastic 9.2.3 容器,所有端口仅绑定本机回环地址,示例日志全部为虚构数据。日志描述一个商城支付服务的超时和连接池耗尽问题。

Logstash 读取 JSONL 文件后写入 shop-logs 索引。Kibana 中建立数据视图后,可以看到 6 条记录,其中 3 条为 ERROR。

Kibana Discover 中的真实实验日志

索引管理页面显示 shop-logs 已创建并包含 6 个文档。单节点实验环境显示 yellow 是因为默认副本无法分配,不等于主分片不可用;生产环境应使用多节点并正确规划副本。

Kibana 索引管理真实截图

随后启动官方 Elasticsearch MCP Server。HTTP 首页暴露 Streamable HTTP 和 SSE 端点。服务日志同时提示:独立 MCP Server 已进入弃用维护状态,Elastic 9.2+ 推荐使用 Agent Builder 内置 MCP。本文保留独立 MCP,是因为它最容易在自建实验中看清数据流;生产新项目应优先评估 Agent Builder。

Elasticsearch MCP Server 真实端点

MCP tools/list 返回了 get_mappingsesqlget_shardssearchlist_indices。再调用 search 查询 ERROR 并按耗时倒序,返回 3 条记录:最长 5008 ms,错误集中在 payment 服务,分别出现 503 和 504。

MCP 工具查询真实结果

这时 Agent 才有资格形成结论:支付服务错误集中出现,最慢请求超过 5 秒,代表性消息包括网关超时和连接池耗尽;下一步应该检查支付依赖的连接池使用率、上游响应时间和同一 trace_id 的上下游日志。注意,这仍然是“基于现有日志的优先级判断”,不是自动宣布根因已经百分之百确认。

一次提问背后发生了什么

ELK 到 AI Agent 的数据流

完整过程可以拆成六步:应用产生日志;Logstash 清洗并标准化;Elasticsearch 建立索引;Agent 根据问题选择 MCP 工具;MCP 执行受限查询;Agent 将返回结果整理成自然语言、表格或排查步骤。

其中最容易被误解的是 MCP。MCP 不是大模型,也不是日志数据库,它更像 USB-C 接口规范:只要 Agent 和工具都遵守同一套“如何列出工具、如何传参数、如何返回结果”的约定,就不必为每一种 Agent 单独写一套私有插件。

一键部署:Windows 11、Ubuntu 26.04、macOS 26

下面三套脚本均使用本机 Docker,不依赖外部 SaaS、云日志平台或托管向量库。它们会启动 Elasticsearch、Logstash、Kibana 和 MCP Server,写入两条脱敏示例日志,并生成通用 mcp.json。下载后请先阅读脚本;演示环境为了降低门槛关闭了安全认证,绝对不要原样暴露到公网

Windows 11 在管理员 PowerShell 中执行:

Set-ExecutionPolicy -Scope Process Bypass
.\install-windows-11.ps1

Ubuntu 26.04 执行:

chmod +x install-ubuntu-26.04.sh
./install-ubuntu-26.04.sh

macOS 26 执行:

chmod +x install-macos-26.sh
./install-macos-26.sh

完成后访问本机 5601 端口打开 Kibana,MCP Streamable HTTP 地址为本机 8080/mcp。脚本生成的 mcp.json 是通用示例,不同 Agent 的配置文件位置可能不同,应以你所使用客户端的当前文档为准。

人工自动执行方法

所谓“人工自动执行”,是你亲自下载并启动脚本,但脚本自动完成文件生成、容器启动和示例数据导入。

执行后先运行:

docker compose ps
curl http://localhost:9200/_cluster/health
curl http://localhost:8080/

然后在 Kibana 创建 app-logs 数据视图,时间字段选择 @timestamp。确认 Discover 能看到日志后,再把 MCP 地址加入 Agent。建议先问只读问题:

请列出 app-logs 可用字段,然后查询 ERROR 日志。
回答必须包含时间范围、查询条件、命中数和三条以内的代表性记录。
不要执行任何写入或删除操作。

Agent 自动配置方法

如果你正在使用能操作终端和文件的 Agent,可以把下面提示词直接交给它。它会读取对应脚本、执行部署、检查健康状态、定位自己的 MCP 配置文件并写入配置。这里的关键是要求 Agent 先备份、只绑定本机、失败就停止,而不是允许它自由发挥。

请在当前电脑部署本地 ELK + Elasticsearch MCP 实验环境:
1. 根据操作系统选择 install-windows-11.ps1、install-ubuntu-26.04.sh 或 install-macos-26.sh;
2. 执行前阅读脚本,确认所有服务只绑定 localhost,不开放公网端口;
3. 执行脚本并等待 Elasticsearch、Kibana、MCP 健康;
4. 读取生成的 mcp.json,找到你自己的 MCP 配置文件,先创建带时间戳备份,再增加 elasticsearch 服务;
5. 不得覆盖其他 MCP 服务,不得写入任何真实密钥;
6. 使用 tools/list 验证工具列表,再以只读方式查询 app-logs;
7. 输出修改文件、备份文件、验证命令与结果摘要。任何一步失败立即停止。

我真实遇到的坑:Logstash 一直运行,却没有索引

实验第一次启动时,Elasticsearch 和 Kibana 都正常,Logstash 容器也曾显示 running,但 shop-logs 始终不存在。继续看日志后发现真正错误是:

Permission denied - /usr/share/logstash/pipeline/logstash.conf

原因不是 Elasticsearch 网络,也不是 pipeline 语法,而是宿主机上传文件的权限过窄。Logstash 容器内以非 root 用户运行,无法读取挂载的配置文件。修复方法是让配置和示例日志至少可读,再重建 Logstash:

chmod 644 pipeline/logstash.conf sample-logs/*.jsonl
docker compose up -d --force-recreate logstash

这个故障非常有代表性:容器“存在”不等于流水线“工作”。排查顺序应该是容器状态、容器日志、Logstash API、目标索引、文档计数,而不是只看 docker ps 的一行绿色状态。

生产环境必须补上的安全措施

生产环境安全边界

演示脚本关闭认证,只适合单机学习。生产环境至少应完成以下事项:

把 Agent 当成刚入职的实习生最容易理解:可以给它阅览室的借书证,但不要把仓库总钥匙、财务章和生产 root 密码一起塞给它。

Agent Builder 还是独立 MCP Server

截至本文实验所用版本,独立 Elasticsearch MCP Server 会明确输出弃用提示,官方推荐 Elastic 9.2+ 用户使用 Agent Builder 内置 MCP。选择可以这样做:

技术选型不要为了“有 AI”而 AI。若一个固定 ES|QL 查询就能解决问题,就不必让模型每次重新规划。

Q&A

接入后能自动修复故障吗

技术上可以继续连接工单、编排或执行系统,但不建议第一天就开放自动修复。先做到“只读分析 + 引用证据 + 人工确认”,稳定后再逐步开放低风险动作。

Kibana AI Assistant 和外部 Agent 有什么区别

Kibana 内置能力更贴近 Elastic 界面和权限体系;外部 Agent 更容易把日志与代码仓库、工单、CMDB、监控等多个工具串联。选择取决于数据边界和工作流,而不是谁看起来更炫。

是否必须使用向量数据库

不必须。状态码、服务名、时间范围、耗时等问题优先用结构化搜索和聚合。只有“寻找语义相近的历史故障说明”这类需求,才更适合向量或混合检索。

日志很多,会不会把 Token 用爆

合理实现不会把原始日志全部发送给模型。MCP 应先在 Elasticsearch 中过滤、聚合和限制条数,只把必要字段与少量样本返回给 Agent。

为什么本文使用虚构日志

真实生产日志很容易包含账号、令牌、内部地址和业务数据。教学截图使用虚构日志,既能复现实验,也不会把隐私带进文章或 Git 仓库。

最后总结

ELK 接入 AI Agent 的核心不是再造一套日志平台,而是在成熟的数据链路上增加一个有标准接口、有最小权限、有审计记录的智能操作层。Logstash 把数据整理好,Elasticsearch 提供可靠查询,Kibana保留人工驾驶舱,MCP 负责连接,Agent 负责把问题拆成查询并解释证据。

真正靠谱的顺序永远是:先把日志结构化,再开放只读查询;先验证证据一致,再谈自动动作;先建立安全边界,再追求“全自动”。做到这些,AI 才不是会编故事的聊天框,而是一个知道去哪里查、查了什么、为什么得出结论的值班助手。

参考资料