ELK 日志收集分析:Elasticsearch + Logstash + Kibana

FreeGuideOnline 最新 2026-06-13

ELK 日志收集分析:Elasticsearch + Logstash + Kibana

ELK 是目前最流行的集中式日志解决方案,由 ElasticsearchLogstashKibana 三个开源工具协同工作,提供从采集、存储、搜索到可视化分析的全套链路。本教程将带领初学者从零搭建一套可用的 ELK 日志系统,并体验一条数据的完整旅程。

组件角色速览

  • Logstash:数据收集引擎,可接收多种来源的日志,经过过滤、解析后发送到多个目标。
  • Elasticsearch:分布式搜索与分析引擎,负责存储日志并提供近乎实时的全文检索能力。
  • Kibana:可视化界面,用来搜索 Elasticsearch 中的数据,并构建仪表盘、图表。

环境准备

本教程使用单机演示环境(出于学习目的,生产环境建议分离部署)。操作系统以 Ubuntu 22.04 为例,其他 Linux 发行版或 macOS 可类比操作。

  • Java 环境:ELK 7.x 及更高版本已内置 JDK,无需单独安装。若使用较低版本,请确保安装 Java 8 或 11。
  • 系统资源:至少 4GB 内存,磁盘 20GB 空闲空间。
  • 用户权限:建议使用具有 sudo 权限的非 root 用户。

以下步骤将安装 ELK 7.17 版本,该版本稳定且免费功能完善。所有组件通过官方仓库安装。


安装 Elasticsearch

Elasticsearch 作为数据存储和检索引擎,是整套系统的核心。

  1. 导入 Elasticsearch 仓库的 GPG 密钥:

    wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
    
  2. 添加仓库:

    echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
    
  3. 更新包索引并安装:

    sudo apt update
    sudo apt install elasticsearch
    
  4. 配置 Elasticsearch,编辑 /etc/elasticsearch/elasticsearch.yml

    # 设置集群名称(单节点可保持默认)
    cluster.name: my-elk-cluster
    # 节点名称
    node.name: node-1
    # 数据与日志存储路径
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    # 绑定网络,便于 Kibana 连接(演示环境使用 localhost)
    network.host: localhost
    http.port: 9200
    # 单节点模式,避免脑裂检查
    discovery.type: single-node
    
  5. 启动并设置开机自启:

    sudo systemctl daemon-reload
    sudo systemctl enable elasticsearch.service
    sudo systemctl start elasticsearch.service
    
  6. 验证安装:

    curl -X GET "localhost:9200/"
    

    输出应包含 cluster_name, version 等信息,代表 Elasticsearch 已成功运行。

安装 Kibana

Kibana 提供图形化界面,用于搜索和可视化 Elasticsearch 中的数据。

  1. 在同一个仓库下直接安装:

    sudo apt install kibana
    
  2. 修改配置文件 /etc/kibana/kibana.yml

    server.port: 5601
    server.host: "localhost"
    elasticsearch.hosts: ["http://localhost:9200"]
    # 可选:设置界面语言(中文需安装对应 Locale)
    # i18n.locale: "zh-CN"
    
  3. 启动 Kibana:

    sudo systemctl enable kibana.service
    sudo systemctl start kibana.service
    
  4. 通过浏览器访问 http://<服务器IP>:5601。首次进入会看到欢迎页面,此时因还没有索引数据,界面提示“找不到任何 Elasticsearch 数据”。

安装 Logstash

Logstash 负责接收、解析并转发日志。

  1. 安装 Logstash:

    sudo apt install logstash
    
  2. Logstash 的配置由 pipeline(管道)组成,定义在 /etc/logstash/conf.d/ 目录下的 .conf 文件。我们先创建一个最基本的管道来验证连通性。

    创建文件 /etc/logstash/conf.d/test-pipeline.conf

    input {
      stdin { }
    }
    output {
      elasticsearch { hosts => ["localhost:9200"] }
      stdout { codec => rubydebug }
    }
    

    这个配置从标准输入读取数据,同时输出到 Elasticsearch 和控制台。

  3. 以测试模式启动 Logstash 并验证:

    sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test-pipeline.conf --config.test_and_exit
    

    若配置语法正确,将看到 “Configuration OK”。然后正式运行:

    sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test-pipeline.conf
    

    在控制台输入一行文字(如 hello elk),Logstash 会解析并输出到屏幕,同时将数据存入 Elasticsearch。

  4. 按 Ctrl+C 停止临时运行的 Logstash。后续我们会将其设置为系统服务。


实战:收集 Apache 访问日志

假设本地运行着 Apache HTTP Server,其访问日志位于 /var/log/apache2/access.log。我们将配置 Logstash 读取该文件、解析为结构化字段、写入 Elasticsearch,最后通过 Kibana 查询可视化。

1. Logstash 配置

创建文件 /etc/logstash/conf.d/apache-access.conf

input {
  file {
    path => "/var/log/apache2/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"    # 演示环境从文件头开始读取,生产不要用 /dev/null
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => "@timestamp"
  }
  geoip {
    source => "clientip"
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "apache-access-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

配置说明

  • input.file:监控指定日志文件,从头读取(start_position => "beginning",配合清除 sincedb 实现重读)。
  • filter.grok:使用预置模式 COMBINEDAPACHELOG 解析通用 Apache combined 格式,提取字段如 clientiptimestampverbrequestresponse 等。
  • filter.date:将解析出的 timestamp 转换为 Elasticsearch 的 @timestamp 字段,方便时间序列分析。
  • filter.geoip:通过客户端 IP 获取地理位置信息(需 Logstash 内置 GeoIP 数据库,或配置 database 参数)。
  • output.elasticsearch:将解析后的文档写入以日期为后缀的索引,便于按天管理。

若 Apache 日志格式不同,可使用 Grok Debugger 在线调试 pattern。

2. 安装 GeoIP 插件(可选)

某些 Logstash 版本需要单独安装 GeoIP 过滤器插件:

sudo /usr/share/logstash/bin/logstash-plugin install logstash-filter-geoip

同时确保 Logstash 具有读取 Apache 日志的权限(可能需要将 logstash 用户加入 adm 组):

sudo usermod -a -G adm logstash

3. 启动 Logstash 服务

停用临时模态,将配置注册为服务运行:

sudo systemctl enable logstash.service
sudo systemctl start logstash.service

检查日志确认管道正常工作:

sudo tail -f /var/log/logstash/logstash-plain.log

4. 在 Kibana 中探索数据

  1. 打开 Kibana 界面,点击左侧导航栏的 ManagementStack ManagementIndex Patterns(索引模式)。
  2. 点击 Create index pattern,输入索引名称模式 apache-access-*,点击“下一步”。
  3. 在时间字段中选择 @timestamp,创建索引模式。
  4. 前往 Discover,选择刚才创建的索引模式,即可看到按时间排序的 Apache 日志记录。
  5. 在搜索栏输入 KQL 查询,例如:
    • 搜索状态码为 404 的请求:response: 404
    • 搜索来自特定 IP 的流量:clientip: "192.168.1.100"
    • 搜索请求中包含 /admin 的日志:request: "/admin"
  6. 点击某条日志的左侧箭头,可展开查看所有字段值,包括地理位置信息(如果配置了 GeoIP)。

5. 创建可视化

  • 转到 Visualize → 创建新的可视化。
  • 选择“垂直条形图”,使用索引模式 apache-access-*
  • 在 Buckets 中添加 X轴,聚合选择 Date Histogram,字段 @timestamp
  • 添加 Y轴,聚合选择 Count
  • 点击运行,即可生成按时间统计的请求量柱状图。

还可创建 Top N 表格,展示访问量最高的客户端 IP 或请求页面。将所有可视化保存后,可组合成监控仪表盘。

配置要点与优化建议

  • 索引生命周期管理(ILM):日志量增长快,建议设置 ILM 策略,自动将旧索引转移到温节点或删除,避免占满磁盘。
  • Logstash 管道并发:高流量场景可配置多个工作线程(pipeline.workers),并设置持久化队列以防数据丢失。
  • 安全性:演示环境未开启认证。生产环境务必启用 Elasticsearch 安全功能(如 X-Pack basic 免费提供的认证、加密通信)。
  • 日志轮转:Logstash 的 sincedb 会记录文件读取偏移量,确保重启后不重复读取,但配置时避免使用 /dev/null

总结

通过 ELK 栈,你已学会将分散的日志集中到 Elasticsearch,用 Logstash 实时解析,并通过 Kibana 实现交互式搜索与可视化。本教程覆盖了从安装到一条完整日志流的实践,为后续构建企业级日志平台打下基础。接下来你可以尝试接入更多日志源(syslog、Nginx、应用日志),搭建更丰富的监控面板。