1. 概述

ELK Stack 是用于日志收集、分析与可视化的经典技术组合,广泛应用于生产环境监控。本文将介绍 ELK 的核心组件及其工作原理,并通过一个 Docker 实践示例帮助你快速上手。

ELK 是 Elasticsearch、Logstash 和 Kibana 三个工具的合称。它们分别承担数据存储、数据处理与数据展示的职责,协同工作以实现日志的全链路管理。

2. ELK 架构解析

ELK 架构如下图所示:

ELK Architecture

各组件职责如下:

  • Elasticsearch:作为分布式搜索引擎,用于存储结构化和非结构化数据,并提供高效的全文检索能力。
  • Logstash:是一个数据处理流水线,负责从多种来源收集、过滤和转换日志数据,再发送到 Elasticsearch。
  • Kibana:提供可视化界面,支持对 Elasticsearch 中的数据进行查询、图表展示及仪表盘构建。

通常,多个 Logstash 实例部署在不同节点上,将日志收集后统一发送至 Elasticsearch 集群。也可以使用 Beats(轻量级数据采集器)作为替代方案,将数据直接发送到 Logstash 或 Elasticsearch。

3. 搭建 ELK 环境

我们使用 Docker Compose 快速搭建一个 ELK 环境:

version: '3.7'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - cluster.name=kernel-logs
      - node.name=node-1
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:8.15.0
    container_name: logstash
    depends_on:
      - elasticsearch
    ports:
      - "5044:5044"
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      - /var/log/syslog:/var/log/syslog:ro
    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.0
    container_name: kibana
    depends_on:
      - elasticsearch
    ports:
      - "5601:5601"
    networks:
      - elk

volumes:
  esdata:

networks:
  elk:
    driver: bridge

启动服务:

$ docker compose up -d

验证 Elasticsearch 状态:

$ curl -X GET "localhost:9200/_cluster/health?pretty"

输出为 status: green 表示集群健康,可以继续后续操作。

4. Elasticsearch 简介

Elasticsearch 是基于 Apache Lucene 构建的分布式搜索引擎,适用于结构化与非结构化数据的快速全文检索。

4.1. 核心优势

✅ 高性能:支持毫秒级响应
✅ 易扩展:可横向扩展节点以处理更大规模数据
✅ REST API:提供丰富的 API 接口,便于集成

4.2. Lucene 查询语法示例

Elasticsearch 使用 Lucene 查询语法,支持复杂条件组合:

"Spring Boot" AND (training OR tutorial) NOT kotlin AND date:[2024-01-01 TO 2024-09-01]

该查询将匹配包含 “Spring Boot”、包含 “training” 或 “tutorial” 的文档,同时排除含 “kotlin” 的文档,并限定在指定日期范围内。

5. Logstash 数据处理

Logstash 是一个强大的数据处理工具,支持从多种来源采集数据、过滤、转换并输出到目标系统(如 Elasticsearch)。

5.1. Beats 采集器

  • Filebeat:用于采集日志文件
  • Metricbeat:用于采集系统指标(如 CPU、内存等)

通常,Beats 部署在各节点上,将原始数据发送到 Logstash 进行预处理,再写入 Elasticsearch。

5.2. 配置 Logstash 管道

创建 Logstash 配置文件:

$ mkdir -p ./logstash/pipeline && touch ./logstash/pipeline/logstash.conf

配置内容如下:

input {
  file {
    path => "/var/log/syslog"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter {
  if [path] =~ "syslog" {
    grok {
      match => { "message" => "^%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} kernel: %{GREEDYDATA:kernel_message}" }
      overwrite => [ "message" ]
    }
    if ![timestamp] {
      drop {}
    }
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "kernel-logs"
  }
}

重启容器使配置生效:

$ docker compose restart

验证数据是否写入 Elasticsearch:

$ curl -X GET "localhost:9200/kernel-logs/_search?pretty"

返回结果中 hits 字段显示命中的日志条目,说明数据采集成功。

6. Kibana 可视化分析

Kibana 是 Elasticsearch 的可视化前端,支持通过图表、地图、表格等方式展示数据,并可构建交互式仪表盘。

6.1. 配置数据源

访问 Kibana 地址 http://localhost:5601,依次点击:

  • Analytics → Discover
  • Create data view
  • 输入索引模式 kernel-logs
  • 保存为数据视图

完成后即可看到采集的日志数据。

Kibana Discover

Kibana: Create data view

Kibana: Cluster detail

Kibana: Data view

6.2. 使用 KQL 查询日志

Kibana 使用 KQL(Kibana Query Language)进行查询,语法简洁高效:

  • 查询包含 "kernel" 的日志:
message.keyword kernel
  • 查询包含 "kernel" 和 "bluetooth" 的日志:
message.keyword kernel and message.keyword bluetooth
  • 查询最近两天的蓝牙内核日志:
message.keyword kernel and message.keyword bluetooth and @timestamp > now-2d

7. 总结

本文介绍了 ELK Stack 的核心组件及其协同工作机制,并通过 Docker Compose 快速搭建了一个完整的 ELK 环境,演示了从日志采集、处理到可视化的完整流程。

✅ ELK 适合用于日志集中管理、实时分析与监控场景
⚠️ 需注意 Logstash 配置的准确性,避免日志格式不匹配导致数据丢失
✅ Kibana 提供强大的可视化能力,适合构建运维监控看板

如需进一步扩展,可考虑引入 Filebeat 实现更轻量的日志采集,或使用 Elastic Stack 的安全模块(如 APM、SIEM)提升系统可观测性。


原始标题:An Introduction to ELK Stack