ELK 日志收集分析:Elasticsearch + Logstash + Kibana
ELK 日志收集分析:Elasticsearch + Logstash + Kibana
ELK 是目前最流行的集中式日志解决方案,由 Elasticsearch、Logstash 和 Kibana 三个开源工具协同工作,提供从采集、存储、搜索到可视化分析的全套链路。本教程将带领初学者从零搭建一套可用的 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 作为数据存储和检索引擎,是整套系统的核心。
-
导入 Elasticsearch 仓库的 GPG 密钥:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg -
添加仓库:
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 -
更新包索引并安装:
sudo apt update sudo apt install elasticsearch -
配置 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 -
启动并设置开机自启:
sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service sudo systemctl start elasticsearch.service -
验证安装:
curl -X GET "localhost:9200/"输出应包含
cluster_name,version等信息,代表 Elasticsearch 已成功运行。
安装 Kibana
Kibana 提供图形化界面,用于搜索和可视化 Elasticsearch 中的数据。
-
在同一个仓库下直接安装:
sudo apt install kibana -
修改配置文件
/etc/kibana/kibana.yml:server.port: 5601 server.host: "localhost" elasticsearch.hosts: ["http://localhost:9200"] # 可选:设置界面语言(中文需安装对应 Locale) # i18n.locale: "zh-CN" -
启动 Kibana:
sudo systemctl enable kibana.service sudo systemctl start kibana.service -
通过浏览器访问
http://<服务器IP>:5601。首次进入会看到欢迎页面,此时因还没有索引数据,界面提示“找不到任何 Elasticsearch 数据”。
安装 Logstash
Logstash 负责接收、解析并转发日志。
-
安装 Logstash:
sudo apt install logstash -
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 和控制台。
-
以测试模式启动 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。 -
按 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 格式,提取字段如clientip、timestamp、verb、request、response等。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 中探索数据
- 打开 Kibana 界面,点击左侧导航栏的
Management→Stack Management→Index Patterns(索引模式)。 - 点击
Create index pattern,输入索引名称模式apache-access-*,点击“下一步”。 - 在时间字段中选择
@timestamp,创建索引模式。 - 前往
Discover,选择刚才创建的索引模式,即可看到按时间排序的 Apache 日志记录。 - 在搜索栏输入 KQL 查询,例如:
- 搜索状态码为 404 的请求:
response: 404 - 搜索来自特定 IP 的流量:
clientip: "192.168.1.100" - 搜索请求中包含
/admin的日志:request: "/admin"
- 搜索状态码为 404 的请求:
- 点击某条日志的左侧箭头,可展开查看所有字段值,包括地理位置信息(如果配置了 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、应用日志),搭建更丰富的监控面板。