ELK 全链路核心知识

一、ELK 要解决什么问题?

在分布式系统中,日志天然存在以下问题:

  • 日志分散在多台机器,无法集中管理
  • 日志格式不统一(纯文本 / JSON / 混合)
  • grep 等方式不可扩展,无法全局搜索
  • 无法做聚合分析(趋势、占比、分布)
  • 跨服务、跨节点问题定位效率极低

ELK 的本质目标只有一句话:

将"不可分析的日志文本",转化为"可搜索、可聚合、可可视化的数据资产"。

二、ELK 的整体链路

ELK 是一条完整的数据流水线,不是三个孤立组件。

复制代码
应用系统
   ↓
日志采集(Filebeat / Agent)
   ↓
日志处理(Logstash / Ingest Pipeline)
   ↓
数据存储与分析(Elasticsearch)
   ↓
数据可视化与运维(Kibana)

角色边界非常清晰:

  • Filebeat:采集,不处理
  • Logstash / Ingest:清洗、结构化
  • Elasticsearch:存 + 查 + 聚合
  • Kibana:查询构建 + 展示

三、Elasticsearch

1. 定位与特性

Elasticsearch 是一个 基于 Lucene 的分布式搜索与分析引擎,核心能力包括:

  • 分布式存储与计算(分片 + 副本)
  • 高性能全文检索(倒排索引)
  • 近实时搜索(默认 1s refresh)
  • 强大的聚合分析能力
  • RESTful API(HTTP + JSON)

在 ELK 中:ES 不是数据库,而是"日志分析引擎"

2. 核心数据模型

|----------|----------|
| 概念 | 类比关系型数据库 |
| Cluster | 集群 |
| Node | 实例 |
| Index | 表 |
| Document | 行 |
| Field | 列 |
| Mapping | 表结构 |

索引(Index)
  • 日志通常按时间滚动索引
  • 示例:log-order-2025.01.01
文档(Document)
  • JSON 格式
  • 每条日志一条文档

3. Mapping

Mapping 决定:

  • 是否能搜索
  • 是否能聚合
  • Kibana 是否好用
  • 性能是否稳定

最关键的字段类型区分:

|---------|------------|
| 类型 | 用途 |
| text | 全文检索(会分词) |
| keyword | 精确匹配、聚合、排序 |
| date | 时间分析 |
| numeric | 数值计算 |

日志字段 90% 应该是 keyword,不是 text

4. 分片与副本

  • Primary Shard:数据写入的最小单位
  • Replica Shard:高可用 + 读扩展

工程经验:

  • 分片数一旦创建不可修改
  • 分片过多 ≠ 性能好(常见性能杀手)

5. 查询与聚合

  • 查询:解决"查得到"
  • 聚合:解决"看得懂"

常用:

  • match:全文检索
  • term:精确匹配
  • bool:组合条件
  • terms / avg / sum:聚合分析

Kibana 所有图表,本质都是 ES 聚合

以下请求获取按账号排序的银行(bank)索引中的所有文档:

复制代码
GET /bank/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}

以下的查询搜索地址(address)字段,用以查找地址包含 milllane的客户

复制代码
GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

以下请求只匹配包含短语 mill lane 的地址:
GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

搜索银行(bank)索引中属于 40 岁客户的账号,但排除其中住在爱达荷州(ID)的人:

复制代码
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}

使用一个词语聚合分组在银行(bank)索引中按州对所有账户分组,并按降序返回账户最多的十个州:

复制代码
GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  }
}

四. Logstash

一、Logstash概述

一句话概括:

Logstash 是日志的"ETL 引擎",负责把杂乱无章的原始日志,变成 Elasticsearch 可分析的数据结构。

在 ELK 链路中的位置:

复制代码
应用系统
   ↓
Filebeat(采集)
   ↓
Logstash(解析 / 清洗 / 结构化 / 路由)
   ↓
Elasticsearch(存储 + 搜索 + 聚合)
   ↓
Kibana(分析 + 可视化)

核心分工边界:

  • Filebeat:只负责"把日志送出来"
  • Logstash:负责"把日志变干净、变结构化"
  • Elasticsearch:负责"存与算"

二、为什么需要 Logstash,而不是直接进 ES?

现实日志的常态是:

非 JSON(Nginx / Java / 自定义格式)

同一系统多种日志格式

字段不统一、噪声字段多

时间格式混乱

需要脱敏、补字段、打标签

Elasticsearch 不擅长做这些事情。

Logstash 专门解决:

日志格式不统一

字段抽取困难

数据清洗与转换

多数据源汇聚

数据路由(写多个 ES / index)

三、Logstash 的核心工作模型

Logstash 的设计极其清晰,只有 三段式流水线

复制代码
Input  →  Filter  →  Output
1. Input(数据从哪来)

常见输入源:

  • beats(Filebeat 最常用)
  • kafka
  • http
  • tcp / udp
  • jdbc(同步数据库)

示例(beats):

复制代码
input {
  beats {
    port => 5044
  }
}
2. Filter(Logstash 的灵魂)

90% 的 Logstash 价值都在 Filter

常用 Filter 插件:

grok(最核心)

  • 正则解析日志

  • 将文本拆成结构化字段

    grok {
    match => { "message" => "%{IP:ip} %{WORD:method} %{URIPATH:path}" }
    }

date

  • 统一时间字段

  • 决定 Kibana 时间轴是否可用

    date {
    match => ["timestamp", "yyyy-MM-dd HH:mm:ss"]
    target => "@timestamp"
    }

mutate

  • 字段重命名、删除、类型转换

    mutate {
    remove_field => ["message"]
    convert => { "status" => "integer" }
    }

json

  • 解析 JSON 日志

    json {
    source => "message"
    }

geoip(日志分析常用)

  • IP → 地理位置
3. Output

常见输出:

  • elasticsearch(最常见)

  • kafka

  • file(调试)

  • stdout(调试)

    output {
    elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "log-app-%{+YYYY.MM.dd}"
    }
    }

四、Logstash 的配置文件结构(工程必会)

一个完整 Logstash pipeline 本质就是一个 .conf 文件:

复制代码
input { ... }

filter { ... }

output { ... }

工程实践建议:

  • input / filter / output 分文件管理
  • 使用 pipeline.id 区分业务
  • 复杂系统使用 multiple pipelines

五、Logstash 在生产中的关键能力

1. 日志结构化(最核心)
  • 文本 → JSON
  • 非结构化 → 可搜索
2. 字段治理
  • 统一字段名
  • 删除无用字段
  • 增加环境、服务名、版本号
3. 多路输出
  • 同一日志写多个 ES
  • 同时写 Kafka + ES
  • 按条件路由日志
4. 解耦应用与 ES
  • 应用不直接依赖 ES
  • ES 挂了,日志不丢(配合 Kafka)

五、Kibana

1. Kibana 的本质定位

Kibana 不是数据系统,而是:

Elasticsearch 的 查询构建器 + 可视化 UI + 运维控制台

它:

  • 不存数据
  • 不做计算
  • 所有能力完全依赖 ES

2. 核心使用模型

复制代码
Data View
   ↓
Discover 看原始日志
   ↓
Visualization / Lens 构建图表
   ↓
Dashboard 组合展示

3. Data View 与时间字段

  • Data View 是 Kibana 访问 ES 的入口
  • 日志索引必须有统一时间字段
  • 时间字段决定:
    • 时间过滤
    • 趋势分析
    • Dashboard 性能

时间字段错误 = Kibana 基本不可用

4. Discover

用途:

  • 实时查看日志
  • 错误定位
  • TraceId 排查
  • 验证 Logstash 解析结果

支持:

  • KQL(推荐)
  • Lucene Query(复杂场景)

5. Dashboard

  • Lens:生产首选(拖拽 + 自动聚合)
  • Dashboard:
    • 全局时间
    • 全局过滤
    • 下钻分析
    • 权限隔离

常见看板:

  • 错误率趋势
  • 接口延迟分布
  • TOP N 异常接口
  • 业务核心指标
相关推荐
oMcLin5 小时前
如何在 Linux 服务器上部署 ELK 日志分析系统(技术深度详解)
linux·服务器·elk
Elastic 中国社区官方博客1 天前
使用 Elasticsearch 中的结构化输出创建可靠的 agents
大数据·人工智能·elk·elasticsearch·搜索引擎·ai·全文检索
时空无限1 天前
EFK 中使用 ruby 和 javascript 脚本去掉日志中颜色字符详解
linux·javascript·elk·ruby
随风语5 天前
ELK日志分析
elk·elasticsearch
阎*水5 天前
ELK 企业日志分析系统总结
elk
-dcr6 天前
47.ELK企业日志分析系统
elk
Elastic 中国社区官方博客6 天前
Elasticsearch:圣诞晚餐 BBQ
大数据·人工智能·elk·elasticsearch·搜索引擎·ai·全文检索
深圳_吴彦祖7 天前
elk部署8.12单机版
elk
2301_800050997 天前
Zabbix和ELK
笔记·elk·zabbix