ClaudeCode×Elasticsearch:服务日志查询的 AI 化落地实践

文章目录

  • [ClaudeCode×Elasticsearch:服务日志查询的 AI 化落地实践](#ClaudeCode×Elasticsearch:服务日志查询的 AI 化落地实践)
  • 一、思路来源与ClaudeCode本文应用
    • [1.1 整体思路来源](#1.1 整体思路来源)
    • [1.2 ClaudeCode本文核心应用](#1.2 ClaudeCode本文核心应用)
  • [二、ClaudeCode在WSL Ubuntu系统的安装](#二、ClaudeCode在WSL Ubuntu系统的安装)
    • [2.1 安装前准备](#2.1 安装前准备)
    • [2.2 具体安装步骤](#2.2 具体安装步骤)
  • 三、Elasticsearch的Skills编写
    • [3.1 Skills编写整体思路与架构设计](#3.1 Skills编写整体思路与架构设计)
    • [3.2 Skills核心内容展示与护栏配置](#3.2 Skills核心内容展示与护栏配置)
      • [3.2.1 注入纯净的环境上下文](#3.2.1 注入纯净的环境上下文)
      • [3.2.2 强制的"字段映射与粒度约束"](#3.2.2 强制的“字段映射与粒度约束”)
      • [3.2.3 "红线"操作规范](#3.2.3 “红线”操作规范)
      • [3.2.4 "红线"操作规范](#3.2.4 “红线”操作规范)
    • [3.3 体验 AI 的"性能最优解"](#3.3 体验 AI 的“性能最优解”)
  • 四、日志采集架构与AI联动
    • [4.1 整体采集架构思路](#4.1 整体采集架构思路)
    • [4.2 Agent Skills编写与采集流程的结合](#4.2 Agent Skills编写与采集流程的结合)
  • 五、结尾
  • 五、结尾

ClaudeCode×Elasticsearch:服务日志查询的 AI 化落地实践

一、思路来源与ClaudeCode本文应用

1.1 整体思路来源

正如我公众号第一篇文章,方案的灵感来源于运维场景的实际需求与 AI 技术的快速发展,OpenCode、Claude Code、Cursor 本质都是代码开发工具,最初并非为运维场景设计;

在实际开发与运维工作中,我们常年面临分布式系统日志管理的核心痛点,这也是本次方案思路的核心来源。

真正耗时的,从来不是"看见日志",而是在海量日志里把有用信息捞出来,再把它们拼成结论。而这件事,恰恰是开发和运维在日常排障里最痛、最烦、也最容易出错的一环。传统 Elasticsearch 查询依赖 DSL,Kibana 又离不开 KQL,语法门槛高,分析链路长,遇到复杂问题时,排查效率和沟通成本都会迅速上升。

所以我在想:

既然 ClaudeCode 已经具备自然语言理解、命令生成和执行能力,那能不能把它真正接进运维场景里,让它帮我查 Elasticsearch、读日志、做初步分析?

答案是可以,但前提不是"直接把 ES 地址丢给 AI"。

因为一旦没有约束,AI 很可能为了查一个 404,直接生成全字段扫描、没有时间边界、没有字段约束的低效查询,轻则返回一堆无效结果,重则把 Elasticsearch 集群拖到高负载。也就是说,AI 想在运维里真正可用,靠的不是模型自己变聪明,而是要有人提前给它立规矩、画边界、喂业务上下文。

于是,我做了这次实践:

把 ClaudeCode 和 Elasticsearch 连接起来,再通过定制化 Skills,把查询规则、字段映射、时间边界、索引范围和操作红线全部提前写清楚。这样一来,原本需要手动编写 DSL 的日志查询,就可以被转化成自然语言指令;而 AI 返回的,也不再是"想当然"的答案,而是带着护栏的查询命令 + 基于结果的初步分析。

1.2 ClaudeCode本文核心应用

本次实践全程围绕nginx访问日志展开演示,因此ClaudeCode的应用均贴合该场景,重点体现在三个核心维度:

一是Skills调用与联动,通过调用后续编写的Elasticsearch专属Skills,建立与ES的稳定连接,精准获取存储在ES中的nginx访问日志(含请求地址、状态码、访问时间、客户端IP等核心字段);

二是日志分析演示,接收Skills返回的nginx日志数据后,可通过自然语言指令,让ClaudeCode完成日志筛选、统计与分析(比如筛选404/异常请求、统计热门访问接口),无需手动编写DSL查询;

三是辅助实操落地,在日志分析过程中,若遇到Skills调用异常、日志查询报错等问题,可借助ClaudeCode的调试能力定位问题,同时可生成日志分析相关的辅助脚本,为后续演示与实操提供支撑,全程服务于"nginx访问日志演示与分析"这一核心目标,也为后文Skills编写逻辑、Flunt-bit日志采集等实操内容做好铺垫。

二、ClaudeCode在WSL Ubuntu系统的安装

2.1 安装前准备

添加网络代理,"科学上网",宿主机开启系统代理:

在WSL启动的ubuntu系统里配置网络代理:

bash 复制代码
    [root@localhost /data]$ vim /etc/profile
    proxy () {
      export http_proxy="http://172.19.128.1:7890"
      export https_proxy=$http_proxy
      export socks5_proxy="socks5://172.19.128.1:7890"
      echo "HTTP Proxy on"
    }

    # noproxy
    noproxy () {
      unset http_proxy
      unset https_proxy
      echo "HTTP Proxy off"
    }
    [root@localhost /data]$ source /etc/profile

开启网络代理,并藏问谷歌进行测试:

bash 复制代码
root@localhost:/data# proxy
HTTP Proxy on
root@localhost:/data# curl -I https://www.google.com
HTTP/1.1 200 Connection established

验证是否生效:

在对应终端执行验证命令,返回状态码 200(或出现 HTTP/1.1 200 / HTTP/2 200)即表示代理生效。

若验证失败,请先分别检查当前终端中的代理变量是否已设置正确,再重新测试。

细节:由于采用的是wsl启动的系统,所以配置的网关要是WSL的vEnthernet:

2.2 具体安装步骤

下载安装脚本并执行安装:

bash 复制代码
curl -fsSL https://claude.ai/install.sh | bash

导入环境变量:

bash 复制代码
[root@localhost /data]$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc
[root@localhost /data]$ claude --version
2.1.63 (Claude Code)

安装完成后,执行以下命令检查 Claude CLI 是否可用:

bash 复制代码
claude --version
2.1.62 (Claude Code)

在环境变量当中添加以下变量

bash 复制代码
# 设置 API 密钥
export ANTHROPIC_AUTH_TOKEN=sk-你的kys
# 设置 API 基础地址
export ANTHROPIC_BASE_URL=https://xxx.xxx.xx 你的api地址
# 禁用非必要流量
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
# 指定模型(可选)
export ANTHROPIC_MODEL=claude-opus-4-6

也可以直接编写settings.json:

bash 复制代码
{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "api_keys",
    "ANTHROPIC_BASE_URL": "https://代理商",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-opus-4-6-20260205",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-6-20260205",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-opus-4-6-20260205",
    "ANTHROPIC_MODEL": "claude-opus-4-6-20260205",
    "BASH_DEFAULT_TIMEOUT_MS": "300000",
    "BASH_MAX_TIMEOUT_MS": "600000",
    "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "55",
    "CLAUDE_CODE_ATTRIBUTION_HEADER": "0",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1",
    "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "32000",
    "DISABLE_AUTOUPDATER": "1",
    "DISABLE_ERROR_REPORTING": "1",
    "DISABLE_TELEMETRY": "1",
    "MAX_THINKING_TOKENS": "16000",
    "MCP_TIMEOUT": "60000",
    "MCP_TOOL_TIMEOUT": "120000"
  },
  "hooks": {
    "SessionEnd": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "ccclub sync --silent",
            "timeout": 30,
            "async": true
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "ccclub sync --silent",
            "timeout": 30,
            "async": true
          }
        ]
      }
    ]
  }
}

网上有众多中转站,大家可以任意选择相关中转站完成大模型的接入,不过本文不为大家提供,以免有打广告的嫌疑嘿嘿。

启动claude code ,选择主题后即可开始对话:

配置完成:

切换模型:

至此,安装部分完成。

三、Elasticsearch的Skills编写

让 ClaudeCode 直接操作 Elasticsearch 极易引发性能灾难,比如可能会出现如全量扫描造成超长上下文。因此,编写专属的 Elasticsearch Skills,本质上是给 AI 制定一份 "说明书"。

(本篇文章的 Skills 内容较多,核心思路已完整呈现,文末附 SKILL.md 核心骨架与 references 目录示例,可直接复用。)

bash 复制代码
~/.claude/skills/elasticsearch-skill/
├── SKILL.md                # 主说明书(基础规则+字段约束)
└── references/             # 深度语法文档(按高级域分类)
    ├── aggregations.md     # 聚合分析语法
    ├── cluster-api.md      # 集群诊断API
    ├── document-api.md     # 文档CRUD语法
    ├── index-api.md        # 索引/映射管理语法
    ├── kibana-api.md       # Kibana操作语法
    ├── otel-data.md        # OTel链路追踪查询语法
    ├── query-dsl.md        # Query DSL语法
    └── search-api.md       # 搜索API语法

3.1 Skills编写整体思路与架构设计

如果你只给 AI 一个 ES 地址,它为了查一个 404 错误,往往会使用性能极差的 query_string 进行全字段跨区扫描,由于没有时间边界,这一条语句就能拉满整个 ES 集群的 CPU,导致业务瘫痪。

设计原则 :为了省 Token 并防止乱来,我们将 ES 的能力做成三层渐进式披露架构,其核心运行流程如下:

text 复制代码
┌─────────────────────────────────┐
│  用户问题                         │
└────────────┬────────────────────┘
             │
             ▼
┌─────────────────────────────────┐
│  加载 SKILL.md 到上下文           │  (Level 2: 高频基础知识)
│  - 环境变量及 Auth 认证方式        │
│  - 核心字段管控表(防坑护栏)        │
│  - 日常 80% 基础查询示例           │
└────────────┬────────────────────┘
             │
             ▼
    ┌────────────────────────┐
    │ 识别:问题属于哪个高级域?  │
    └────────────────────────┘
    │
    ├─ 搜索/Query DSL? ────→ 加载 references/query-dsl.md + search-api.md
    │
    ├─ 聚合分析? ──────────→ 加载 references/aggregations.md + aggregations-api.md
    │
    ├─ 索引/映射管理? ──────→ 加载 references/index-api.md + mapping-api.md
    │
    ├─ 文档CRUD? ──────────→ 加载 references/document-api.md
    │
    ├─ 集群诊断? ──────────→ 加载 references/cluster-api.md
    │
    ├─ Kibana 操作? ───────→ 加载 references/kibana-api.md
    │
    └─ OTEL 查询? ─────────→ 加载 references/otel-data.md
             │
             ▼
    ┌──────────────────────────────────┐
    │  组合 SKILL.md (基础规则) +        │
    │  匹配到的 references/ (深度语法)    │
    │  → 构造出精准、安全的 curl 命令      │
    └──────────────────────────────────┘

流程解析:

  • 基础打底(Level 1/2) :ClaudeCode调用Skills时,默认仅读取主说明书SKILL.md,文中强制规定了nginx日志查询的"安全红线"------比如查询必须带时间参数、必须使用正确的字段名(如http.response.status_code),同时包含ES认证信息和基础查询示例。对于简单查询AI直接在此层面完成响应,无需加载深层语法,节省Token且提升效率。
  • 意图分发(Level 3) :当用户提出复杂查询需求(如"统计最近30分钟nginx不同状态码的访问量,并用composite聚合分析请求趋势"),AI会根据SKILL.md中的指引,精准识别需求所属的高级域(聚合分析+Query DSL),仅加载对应的aggregations.mdquery-dsl.md,避免加载无关的API文档。
  • 最终组合(出结果) :AI将SKILL.md中的基础规则与加载的深层语法结合,生成可直接在终端执行的curl命令,既保证查询精准性(贴合nginx日志字段),又确保查询安全性,同时最大化节省Token。

3.2 Skills核心内容展示与护栏配置

Skills的核心价值在于"划定安全边界、适配业务场景",结合本次nginx访问日志查询需求,我们在Level 2的SKILL.md中,植入了与nginx日志高度绑定的护栏配置,从环境、字段、操作三个维度,强制规范AI的查询行为,确保每一次查询都安全、高效。

3.2.1 注入纯净的环境上下文

为避免ClaudeCode每次查询时重复询问ES账号、密码等信息,同时规范认证方式,我们在Skills中直接指定环境变量读取规则,所有curl查询命令均严格遵循统一格式,确保与ES集群连接的安全性和一致性,适配nginx日志索引查询场景:

bash 复制代码
# 所有 curl 示例必须严格遵循此格式:
curl -s "${ES_URL%/}/nginx-*/_search" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)" \
  -H "Content-Type: application/json" \
  ...

nginx-* 索引匹配规则,对应后续Fluent-bit采集nginx日志时的索引命名规范,确保AI仅操作nginx相关日志索引,避免误操作其他业务索引。

3.2.2 强制的"字段映射与粒度约束"

AI缺乏nginx日志的业务常识,无法识别合理的查询字段与查询方式,因此我们将Fluent-bit采集落盘后,ES中nginx访问日志的真实字段表,强制植入Skills,明确规定每个字段的查询方式和用途,从根源上避免低效查询(如用query_string全字段扫描)。以下是nginx访问日志专属字段约束表:

ES 字段名 类型 查询方式 说明
@timestamp date range 日志时间,始终用于时间过滤
client.ip keyword term 客户端 IP,精确匹配
http.request.method keyword term HTTP 方法:GET / POST / PUT
http.request.referrer keyword term Referer 头
http.response.body.bytes long range 响应体大小(字节)
http.response.status_code keyword term / terms HTTP 状态码,如 "200" / "404" / "500"
http.version keyword term HTTP 协议版本:1.1 / 2.0
url.original keyword term / wildcard 完整请求路径(含查询参数)
user_agent.original keyword term / wildcard User-Agent 原始字符串
message text match 原始日志行全文
service.name keyword term 服务名
host.name keyword term 部署节点主机名
log.file.path keyword term / wildcard 日志文件路径
event.dataset keyword term 数据集名称(如 nginx.access

当然,这是针对于nginx的日志来说,要是针对于生产场景下的微服务来说,就可以参考下面的内容:

补充说明:上述字段均由Fluent-bit采集nginx日志时,按规范解析后写入ES(具体采集与解析逻辑,在第四部分详细讲解)。

若为生产环境微服务日志,可参考此格式,自定义字段映射表,核心是"明确字段用途、规范查询方式"。

至于这里面的"字段由xxxxxx解析后写入es",这是本文的核心思想,会在后面进行详细讲述。

3.2.3 "红线"操作规范

由于Skills中植入了字段约束、时间边界要求和操作规范,AI会瞬间绕过query_string全字段扫描的误区,输出带有完美护栏的最优查询命令,无需手动干预,可直接在终端执行,具体如下:

bash 复制代码
# ClaudeCode输出的查询命令(自动遵循Skills约束)
curl -s "${ES_URL%/}/nginx-*/_search" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)" \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "filter": [
          { "range": { "@timestamp": { "gte": "now-10m", "lte": "now" } } },  # 强制时间边界
          { "term": { "http.response.status_code": "500" } },  # 精准匹配状态码(符合字段约束)
          { "term": { "event.dataset": "nginx.access" } }  # 仅查询nginx访问日志
        ]
      }
    },
    "size": 100  # 限制返回条数,避免数据过多
  }' | jq '.hits.hits[]._source | {time: .["@timestamp"], client_ip: .["client.ip"], url: .["url.original"], status: .["http.response.status_code"]}'  # 输出瘦身

对应的ES查询DSL核心过滤条件(AI自动生成,符合性能最优原则):

json 复制代码
{
  "filter": [
    { "range": { "@timestamp": { "gte": "now-10m", "lte": "now" } } },  # 时间边界不可少
    { "term": { "http.response.status_code": "500" } }  # 精准匹配,替代低效的query_string
  ]
}

3.2.4 "红线"操作规范

核心skills片段展示:

bash 复制代码
---
name: elasticsearch
description: >
  通过 REST API(curl)操作 Elasticsearch 和 Kibana。适用于查询、索引、管理索引、
  检查集群健康状态、编写聚合、部署 Dashboard,以及排查 Elasticsearch 问题。
  支持从环境变量加载连接配置(URL、API Key 或用户名/密码)。
  涵盖:搜索(Query DSL / ES|QL)、CRUD、索引管理、Mapping、聚合、集群健康、
  ILM、Kibana API(Dashboard、数据视图、Saved Objects)、OpenTelemetry 数据模式。
---

# Elasticsearch

所有 Elasticsearch 操作均通过 REST API 使用 `curl` 完成,无需 SDK 或客户端库。

## 环境变量配置
使用前请先设置连接配置,支持两种认证方式:
```bash
# ── 必填 ──────────────────────────────────────────────
ES_URL="https://your-cluster.es.cloud.elastic.co:443"

# ── 认证方式一:API Key(推荐,适用于 Elastic Cloud)──
ES_API_KEY="your-base64-api-key"

# ── 认证方式二:用户名/密码(适用于自建集群)──────────
ES_USER="elastic"
ES_PASS="your-password"

# ── Kibana(仅使用 Kibana API 时需要)─────────────────
KIBANA_URL="https://your-deployment.kb.us-east-1.aws.elastic.cloud"
```
> 优先使用 `ES_API_KEY`;若未设置,自动回退到 `ES_USER` + `ES_PASS`。
### 认证请求模板
```bash
# API Key 认证
curl -s "${ES_URL%/}/<endpoint>" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)" \
  -H "Content-Type: application/json" \
  -d '<json-body>'

# 用户名/密码认证
curl -s "${ES_URL%/}/<endpoint>" \
  -u "$(printenv ES_USER):$(printenv ES_PASS)" \
  -H "Content-Type: application/json" \
  -d '<json-body>'
```

**重要说明:**
- 始终用 `$(printenv ES_API_KEY)` 而非 `$ES_API_KEY`,防止变量在 curl 中展开失败导致 401 错误
- 始终用 `${ES_URL%/}` 去除末尾斜杠,防止路径出现双斜杠(如 `//_cluster/health`)

## 快速健康检查

```bash
# 集群健康状态(green/yellow/red)------Serverless 不可用
curl -s "${ES_URL%/}/_cluster/health" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)" | jq .

# 索引概览(Serverless 和传统部署均可用)
curl -s "${ES_URL%/}/_cat/indices?v&s=store.size:desc&h=index,health,status,docs.count,store.size" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)"
```

**Serverless 注意:** 若收到 `api_not_available_exception` 错误,说明是 Serverless 模式。以下 API 在 Serverless 中**不可用**:
- `_cluster/health`、`_cluster/settings`、`_cluster/allocation/explain`
- `_cat/nodes`、`_cat/shards`
- `_nodes/hot_threads`、`_nodes/stats`
- ILM 相关 API(`_ilm/*`)


...省略1w字...


---
## 搜索(Query DSL)
```bash
# 简单 match 查询
curl -s "${ES_URL%/}/my-index/_search" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)" \
  -H "Content-Type: application/json" \
  -d '{
    "query": { "match": { "message": "error timeout" } },
    "size": 10,
    "sort": [ { "@timestamp": { "order": "desc" } } ]
  }' | jq .

# Bool 组合查询(must + filter + must_not)
curl -s "${ES_URL%/}/my-index/_search" \
  -H "Authorization: ApiKey $(printenv ES_API_KEY)" \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
      "bool": {
        "must":    [ { "match": { "message": "error" } } ],
        "filter":  [ { "range": { "@timestamp": { "gte": "now-1h" } } } ],
        "must_not":[ { "term":  { "level": "debug" } } ]
      }
    },
    "size": 20
  }' | jq .
```
完整 Query DSL 参考(term、range、wildcard、nested、multi_match 等)→ [references/query-dsl.md](references/query-dsl.md)
完整 Search API 参考(ES|QL、EQL、分页、高亮等)→ [references/search-api.md](references/search-api.md)

3.3 体验 AI 的"性能最优解"

我们进行测试:

前提我们已经写在skills里了,就是es的配置信息,需要写在环境变量里,我们写在了settings.json的env字段里:

bash 复制代码
{
  "env": {
    ...
    "ES_URL": "http://127.0.0.1:9200",
    "ES_USER": "elastic",
    "ES_PASS": "password"
  },

接下来我们让它分析一下,今天访问前三的请求路径是什么:

首先,它生成了一条查询命令,但是显然,它生成的命令是存在一部分小问题,并未拿到正确结果,接下来重新生成了一条:

bash 复制代码
curl -s "${ES_URL%/}/nginx-access-*/_search?size=0" \
     -u "$(printenv ES_USER):$(printenv ES_PASS)" \
     -H "Content-Type: application/json" \
     -d '{
       "query": {
         "range": { "@timestamp": { "gte": "now/d", "lte": "now" } }
       },
       "aggs": {
         "top_urls": {
           "terms": {
             "field": "url.original.keyword",
             "size": 3,
             "order": { "_count": "desc" }
           }
         }
       }
     }' | jq -r '.aggregations.top_urls.buckets | to_entries | .[] | "第\(.key + 1)名: \(.value.key) - 访问次数: \(.value.doc_count)"'

很显然这次拿到了分析结果,并且还帮助我们分析了结果:

由于不想拿简单的服务进行测试,直接用nginx的80端口反向代理了Kibana的端口,所以都是访问Kibana的参数

再测试一个相对较难的内容:

我用Kibana创建一个数据视图,去匹配一个不存在的索引,导致日志会出现404问题,我们让AI分析为何会404这个问题。

bash 复制代码
curl -s "${ES_URL%/}/nginx-error-*/_search" \
     -u "$(printenv ES_USER):$(printenv ES_PASS)" \
     -H "Content-Type: application/json" \
     -d '{
       "query": {
         "bool": {
           "filter": [
             { "range": { "@timestamp": { "gte": "now-5m" } } },
             { "term": { "http.response.status_code": "404" } }
           ]
         }
       },
       "size": 10,
       "sort": [ { "@timestamp": { "order": "desc" } } ]
     }' | jq -r '.hits.hits[]._source | "\(.["@timestamp"]) | IP: \(.["client.ip"]) | \(.["http.request.method"]) \(.["url.original"]) | 状态: \(.["http.response.status_code"]) | UA:
   \(.["user_agent.original"] // "none")"'

很显然AI分析失败了,这也就是说,AI有时候是真的不懂业务;其实也不能这么说,主要是你提供的skills里得真的有和你业务相关状态的内容提示,当你Skills里定义的不详细或业务过于复杂但并未让AI明确的时候就会出现类似的问题。

不过我想了一下,其实也可以定义一个skills进行联网查询,让它从广泛数据中进行查询,然后获得更加精准的结果,当然这也意味着token会在天上飞。

不管怎样,我们的核心功能还是实现了的。

四、日志采集架构与AI联动

4.1 整体采集架构思路

讲完了AI部分,我们来谈一谈,数据采集,我的数据采集流程是"EFK":

  • E:Elasticsearch
  • F:Fluent-bit
  • K:Kibana

Fluent Bit 作为日志采集核心(F 环节),核心作用是:实时采集 Nginx 访问/错误日志,经过简单过滤、解析和字段增强后,将标准化日志输出至 Elasticsearch(E 环节),为后续 Kibana(K 环节)可视化分析提供数据支撑。

那么核心就是Fluent,它如何能够把日志精准的采集到的呢:

Fluent Bit通过加载/etc/fluent-bit/目录下的全套模板文件(主配置fluent-bit.conf、环境变量fluent-bit.env、解析模板parsers.conf和multiline_parsers.conf、字段增强脚本enrich.lua),以tail插件监听Nginx访问及错误日志,经过滤标准化、格式解析、字段增强后,按指定格式将结构化日志稳定输出至Elasticsearch,全程自动化完成**"采集→处理→输出"**,无需额外开发,仅需微调少量关键参数即可复用。

当然,市面上日志采集工具有很多,比如Filebeta、Logstash,但是我还是选择了Fluent Bit,一个字:轻。它资源占用低、配置简洁,无需复杂部署,仅凭一套可复用的模板就能完成日志采集全流程,远比同类工具更轻便、更高效,当然配置上可能稍显复杂,但是还在可接受范围之内,对比一下就晓得了:

采集工具 资源占用 配置复杂度 性能 易用性 适用场景
Fluent Bit 极低(MB 级内存) 中等 高(百万日志 / 秒) 中等 容器 / 轻量服务器 / 边缘节点
Logstash 高(GB 级内存) 复杂日志处理 / 中台级采集
Filebeat 简单日志采集(无复杂处理)

4.2 Agent Skills编写与采集流程的结合

为什么要说这里?

是因为我感受到了一些不一样的东西,就是前瞻思想。

如果我不这样按照严格的模板化采集日志,那么前文编写的 Elasticsearch Skills 就会彻底失去价值 ,AI 基于 Skills 里的字段约束生成的查询命令,会因为ES中日志字段命名不统一、格式不规范、关键信息缺失,最终要么查不到数据,要么返回无效结果,所谓 "AI 赋能日志分析" 也就成了空谈。

层级 采集侧(Fluent Bit)动作 Skills 侧对应设计 最终效果
字段命名层 通过parsers.conf解析日志时,将 nginx 原生字段(如remote_addr)映射为 ES 标准字段(如client.ip),并严格遵循 ECS(Elastic Common Schema)规范 Skills 的 "字段映射与粒度约束表" 直接复用 ECS 标准字段名,明确client.ipkeyword类型、仅支持term查询 AI 生成的查询命令中,字段名与 ES 中存储的字段完全一致,避免 "查错字段"
格式规范层 强制解析@timestamp字段为 ISO8601 格式,状态码status转为字符串类型,url.original保留完整请求路径 Skills 中规定@timestamp必须用range做时间过滤,http.response.status_code(对应采集侧status)仅支持term/terms查询 AI 生成的查询命令能精准命中数据类型,避免 "字符串字段用数值查询""时间字段格式不兼容" 等语法错误
索引隔离层 Fluent Bit 输出日志时,按 "nginx-access-YYYY.MM.DD""nginx-error-YYYY.MM.DD" 命名索引 Skills 中限定查询索引为nginx-*,并区分event.dataset: nginx.access/nginx.error AI 仅操作指定索引,避免误查其他业务日志,同时可精准区分访问 / 错误日志场景

五、结尾

受AI的影响,现在做方案都会考虑一些后手,也就是所谓的AI赋能,究竟应该如何把AI融入到运维去实现高效运维,提高生产效率,已经成为今年共同探索的核心方向了,当然,现在很多大厂都有相关产品,比如某公司的SREAgent,刚出来的时候真的很吓人,但是吓人归吓人,日子还得一天天的过,一个人探索未来,跟着大厂的思想走,何尝不是一种快乐呢?

这个文章其实也只是探索过程中的一部分,结合第一篇文章,其实已经落地了现代微服务三大监控中的两个了,还缺少一个分布式链路追踪。

但是真的缺少么?有细心的人其实能在我放的截图里看到了一个OTel的skills 了,一套基于Elasticsearch、Jaeger、OpenTelemetry实现分布式链路追踪的方案其实早已写完并且完成测试了,只不过skills还没有定义的非常详细,链路追踪真的是重头戏,那个skills必须要完全懂得业务逻辑才能去让AI变得刚高效,所以,每天提升自己刻不容缓哈哈哈,那就写到这里了,拜拜,我们评论区见。

s 中限定查询索引为nginx-*,并区分event.dataset: nginx.access/nginx.error | AI 仅操作指定索引,避免误查其他业务日志,同时可精准区分访问 / 错误日志场景 |

五、结尾

受AI的影响,现在做方案都会考虑一些后手,也就是所谓的AI赋能,究竟应该如何把AI融入到运维去实现高效运维,提高生产效率,已经成为今年共同探索的核心方向了,当然,现在很多大厂都有相关产品,比如某公司的SREAgent,刚出来的时候真的很吓人,但是吓人归吓人,日子还得一天天的过,一个人探索未来,跟着大厂的思想走,何尝不是一种快乐呢?

这个文章其实也只是探索过程中的一部分,结合第一篇文章,其实已经落地了现代微服务三大监控中的两个了,还缺少一个分布式链路追踪。

但是真的缺少么?有细心的人其实能在我放的截图里看到了一个OTel的skills 了,一套基于Elasticsearch、Jaeger、OpenTelemetry实现分布式链路追踪的方案其实早已写完并且完成测试了,只不过skills还没有定义的非常详细,链路追踪真的是重头戏,那个skills必须要完全懂得业务逻辑才能去让AI变得刚高效,所以,每天提升自己刻不容缓哈哈哈,那就写到这里了,拜拜,我们评论区见。

相关推荐
Eloudy1 小时前
CHI 开发备忘 12 记 -- CHI spec 12 链路层
人工智能·算法·arch·hpc
AI周红伟1 小时前
周红伟:OpenClaw +GPT-5.4 操控电脑丝滑,原生操控电脑暴击opus4.6
人工智能
xy_cpp1 小时前
和AI一起编程
人工智能
云存储小天使1 小时前
提效 77%:GooseFS 写缓存及其在自动驾驶数据处理中的应用
人工智能·缓存·自动驾驶
东离与糖宝1 小时前
OpenClaw + SpringCloud 微服务集成:AI 能力全局复用
java·人工智能
von Neumann1 小时前
大模型从入门到应用——HuggingFace:Transformers-[零基础快速上手:自然语言处理任务]
人工智能·python·ai·自然语言处理·大模型·aigc·transformer
AiTop1001 小时前
OpenAI发布GPT-5.4:支持百万Token上下文与原生电脑操作
人工智能·gpt·ai·aigc
我是苏苏1 小时前
Web开发:自动化部署!在Windows系统上安装和使用Jenkins!
运维·自动化·jenkins
Tezign_space1 小时前
Agentic AI vs Copilot:为什么企业AI需要从“辅助工具”升级为“核心协作者”
大数据·人工智能·copilot