文章目录
- ELK企业级日志分析系统:从零搭建集中化日志平台
-
- 前言
- 一、ELK概述
-
- [1.1 三大组件定位](#1.1 三大组件定位)
- [1.2 ELK工作原理](#1.2 ELK工作原理)
- [1.3 Elasticsearch详解](#1.3 Elasticsearch详解)
- [1.4 Logstash详解](#1.4 Logstash详解)
- [1.5 Kibana详解](#1.5 Kibana详解)
- 二、案例环境配置
-
- [2.1 环境规划](#2.1 环境规划)
- [2.2 准备主机名、域名、Java环境](#2.2 准备主机名、域名、Java环境)
- 三、部署Elasticsearch集群
-
- [3.1 安装Elasticsearch(node1)](#3.1 安装Elasticsearch(node1))
- [3.2 安装Elasticsearch(node2)](#3.2 安装Elasticsearch(node2))
- [3.3 集群健康检查](#3.3 集群健康检查)
- [3.4 安装Elasticsearch-Head插件](#3.4 安装Elasticsearch-Head插件)
- [3.5 创建索引测试](#3.5 创建索引测试)
- 四、安装Logstash
-
- [4.1 Apache主机准备](#4.1 Apache主机准备)
- [4.2 安装Logstash](#4.2 安装Logstash)
- [4.3 Logstash基础测试](#4.3 Logstash基础测试)
- [4.4 配置Logstash采集系统日志](#4.4 配置Logstash采集系统日志)
- [4.5 配置Logstash采集Apache日志](#4.5 配置Logstash采集Apache日志)
- 五、安装Kibana
-
- [5.1 安装Kibana(node1)](#5.1 安装Kibana(node1))
- [5.2 配置索引模式](#5.2 配置索引模式)
- [5.3 对接Apache日志索引](#5.3 对接Apache日志索引)
- [5.4 创建可视化图表](#5.4 创建可视化图表)
- [5.5 创建仪表盘](#5.5 创建仪表盘)
- 六、本章小结
ELK企业级日志分析系统:从零搭建集中化日志平台
Elasticsearch、Logstash、Kibana三大组件实战,从架构原理到集群部署,一篇文章搞定日志集中管理
前言
日志分析是运维工程师解决系统故障、发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。
传统方式的痛点:
- 日志分散存储在不同设备上,管理数十上百台服务器时,依次登录每台机器查阅日志既繁琐又低效
- 集中化管理日志后,使用grep、awk、wc等命令检索统计,面对高要求的查询、排序和庞大的机器数量,依然力不从心
ELK平台的优势 :开源实时日志分析ELK平台能够完美解决上述问题,由Elasticsearch、Logstash和Kibana三个开源工具组成。
本文将系统讲解ELK的完整知识体系和部署实战,涵盖核心概念、集群搭建、Logstash数据采集、Kibana可视化,帮助你在生产环境中搭建一套完整的日志分析平台。
一、ELK概述
1.1 三大组件定位
| 组件 | 定位 | 核心作用 |
|---|---|---|
| Elasticsearch | 分布式搜索和分析引擎 | 存储处理后的日志,提供高速查询与复杂数据分析 |
| Logstash | 服务器端数据处理管道 | 收集、过滤日志,并存储供以后使用 |
| Kibana | 数据可视化平台(Web界面) | 为Logstash和Elasticsearch提供友好的日志分析Web界面 |
一句话理解三者关系:
想象一下银行系统:
- Logstash 就像各地的柜台职员和运钞车,负责从各个来源收集货币(数据),进行清点、辨别真伪、分类整理,然后运送到总行金库
- Elasticsearch 就是银行的巨型、高科技、超高效的金库和归档系统,不仅安全存储所有货币,还建立精细索引,能在一瞬间从海量库存中精准找到任何一笔交易记录
- Kibana 则是银行的数据分析和监控中心的大屏幕,通过图表、仪表盘、地图来可视化金融趋势、交易流水、风险状况
核心数据流:
text
日志/数据源 → Logstash(收集、处理) → Elasticsearch(存储、索引、搜索) → Kibana(可视化、分析)
1.2 ELK工作原理
text
APPServer集群 → Logstash Agent采集器 → Elasticsearch Cluster → Kibana Server → Browser
完整处理流程:
- Filebeat 将日志进行集中化管理(beats家族),替代Logstash采集端
- Logstash 将日志格式化
- Elasticsearch 对格式化后的数据进行索引和存储
- Kibana 前端数据的展示
1.3 Elasticsearch详解
核心角色:大脑和心脏
详细作用:
1. 分布式存储与高可用性
Elasticsearch是一个分布式数据库。数据会被分散存储在多台服务器(节点)上。这意味着它可以处理PB级别的海量数据,并且通过副本(replicas)机制,即使某个硬件发生故障,数据也不会丢失,服务也不会中断。
2. 近乎实时的搜索
数据从被写入到可以被搜索,只有毫秒级的延迟(约1秒内)。这对于需要实时监控和告警的场景至关重要。
3. 强大的全文搜索引擎
基于Apache Lucene构建,提供了强大和灵活的全文搜索功能:
- 模糊搜索:即使拼写错误也能找到结果
- 同义词处理:搜索"手机"也能找到包含"电话"的结果
- 相关性评分:根据多种因素对搜索结果进行排序
4. 先进的索引技术
数据在存储时会被倒排索引(Inverted Index)。这是一种类似书籍最后"索引"页的技术(例如,提到"数据库"这个词的页面是10、23、45)。这使得查询速度极快,远优于传统的逐行扫描数据库。
5. 丰富的RESTful API
几乎所有操作,如数据的写入、查询、集群管理,都可以通过简单的HTTP REST API进行,非常容易与其他系统集成。
6. 强大的聚合分析能力
除了搜索,它还能执行复杂的聚合(Aggregation)操作,相当于SQL中的GROUP BY再加上数学运算。例如:
- 统计过去5分钟内错误日志的数量并按应用分组
- 计算网站访问量的95百分位延迟
- 绘制用户地理位置的分布图
简单总结:Elasticsearch是一个专门为"快速查找"而设计的海量数据存储系统。它不擅长频繁更新事务(像MySQL那样),但极其擅长快速过滤、查询和分析巨量数据。
1.4 Logstash详解
核心角色:搬运工和预处理车间
Logstash的工作流程被划分为三个阶段:Input → Filter → Output。
1. Input(输入):数据收集
从各种来源实时地收集数据和日志,拥有大量的插件:
- 文件(如
*.log) - 系统日志(Syslog)
- 消息队列(Kafka、Redis、RabbitMQ)
- 数据库(MySQL、PostgreSQL)
- 监控数据(Beats、JMX)
- 网络协议(TCP/UDP、HTTP)
2. Filter(过滤):数据解析与enrichment
这是Logstash最强大的部分。原始日志(如一行文本)通常是非结构化的,Filter插件将其解析成结构化的、有意义的字段。
常见操作:
| 插件 | 作用 |
|---|---|
| Grok | 使用正则模式匹配解析复杂文本行,提取client_ip、timestamp、http_method等字段 |
| Mutate | 对字段修改:重命名、删除、替换、转换数据类型 |
| Date | 解析时间戳,设置为事件的正式@timestamp字段 |
| GeoIP | 根据IP地址查询对应国家、城市和经纬度信息 |
| KV | 解析key=value格式的数据 |
3. Output(输出):数据发送
将处理好的数据发送到指定目的地。最常用输出是Elasticsearch,也支持:
- 其他数据库(MongoDB)
- 消息队列(Kafka)
- 文件系统
- 监控系统(Nagios)
- 电子邮件
小提示 :在需要轻量级数据收集的场景下,Elastic提供了Beats(如Filebeat、Metricbeat)来替代Logstash的Input功能,它们更轻量、更专一。
1.5 Kibana详解
核心角色:窗口和仪表盘
1. 数据探索与发现(Discover)
提供交互式界面,直接查询和浏览Elasticsearch中的原始数据。支持Lucene查询语法或KQL,添加过滤器动态缩小数据范围。
2. 可视化(Visualize)
提供丰富的可视化组件:
- 柱状图、折线图、饼图
- 指标看板(显示单个数字,如总错误数)
- 数据表(聚合数据)
- 坐标地图(与GeoIP结合显示数据点)
- 热力图等
3. 仪表盘(Dashboard)
将多个可视化组件拖放组合成统一的综合仪表盘,用于构建实时监控大屏。
4. 管理和维护
Kibana提供Stack Management界面,用于:
- 索引生命周期管理(ILM)
- 用户和角色权限控制
- 导入/导出保存的可视化和仪表盘配置
简单总结:Kibana是ELK Stack的"面子",将Elasticsearch中深奥的数据以人类易于理解的图形方式呈现出来,使得任何人都能轻松进行数据分析和决策。
二、案例环境配置
2.1 环境规划
配置和安装ELK日志分析系统,安装集群方式,2个Elasticsearch节点,并监控apache服务器日志。
| 主机 | 操作系统 | 主机名 | IP地址 | 主要软件 |
|---|---|---|---|---|
| 服务器 | CentOS 7.9 | node1 | 192.168.108.41 | Elasticsearch + Kibana |
| 服务器 | CentOS 7.9 | node2 | 192.168.108.42 | Elasticsearch |
| 服务器 | CentOS 7.9 | apache | 192.168.108.43 | Logstash + Apache |
2.2 准备主机名、域名、Java环境
node1(192.168.108.41):
bash
# 配置域名解析
[root@node1 ~]# vim /etc/hosts
192.168.108.41 node1
192.168.108.42 node2
# 查看Java环境
[root@node1 ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
node2(192.168.108.42):
bash
# 配置域名解析
[root@node2 ~]# vim /etc/hosts
192.168.108.41 node1
192.168.108.42 node2
# 查看Java环境
[root@node2 ~]# java -version
openjdk version "1.8.0_262"
三、部署Elasticsearch集群
3.1 安装Elasticsearch(node1)
bash
# 安装Elasticsearch rpm包
[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
# 加载系统服务
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable elasticsearch.service
# 备份主配置文件
[root@node1 ~]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
# 修改主配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster # 集群名字
node.name: node1 # 节点名字
path.data: /data/elk_data # 数据存放路径
path.logs: /var/log/elasticsearch/ # 日志存放路径
bootstrap.memory_lock: false # 不在启动时锁定内存
network.host: 0.0.0.0 # 提供服务绑定的IP地址
http.port: 9200 # 侦听端口
discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 集群发现通过单播实现
# 创建数据存放路径并授权
[root@node1 opt]# mkdir -p /data/elk_data
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/
# 启动elasticsearch
[root@node1 elasticsearch]# systemctl start elasticsearch.service
[root@node1 elasticsearch]# netstat -antp | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 64463/java
验证 :浏览器打开 http://192.168.108.41:9200,可以看到节点信息:
json
{
"name": "node1",
"cluster_name": "my-elk-cluster",
"version": {
"number": "5.5.0",
"lucene_version": "6.6.0"
},
"tagline": "You Know, for Search"
}
3.2 安装Elasticsearch(node2)
bash
# 安装Elasticsearch rpm包
[root@node2 ~]# cd /opt
[root@node2 opt]# rpm -ivh elasticsearch-5.5.0.rpm
# 加载系统服务
[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl enable elasticsearch.service
# 修改主配置文件(node.name改为node2)
[root@node2 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node2
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
# 创建数据存放路径并授权
[root@node2 ~]# mkdir -p /data/elk_data
[root@node2 ~]# chown elasticsearch:elasticsearch /data/elk_data/
# 启动elasticsearch
[root@node2 elasticsearch]# systemctl start elasticsearch.service
[root@node2 elasticsearch]# netstat -antp | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 64463/java
验证 :浏览器打开 http://192.168.108.42:9200,可以看到node2节点信息。
3.3 集群健康检查
浏览器访问 http://192.168.108.41:9200/_cluster/health?pretty:
json
{
"cluster_name": "my-elk-cluster",
"status": "green", # green表示正常
"timed_out": false,
"number_of_nodes": 2, # nodes为2
"number_of_data_nodes": 2,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100.0
}
集群状态说明:
- green:一切正常
- yellow:所有主分片正常,但副本分片未分配
- red:有主分片未分配,数据不完整
3.4 安装Elasticsearch-Head插件
Elasticsearch-Head是一个可视化管理工具,方便管理集群。
node1安装node.js(head插件的基础环境):
bash
# 安装编译依赖
[root@node1 ~]# yum install gcc gcc-c++ make -y
# 编译安装node组件(耗时约10分钟)
[root@node1 ~]# cd /opt
[root@node1 opt]# tar xzvf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j4
[root@node1 node-v8.2.1]# make install
安装phantomjs前端框架:
bash
# 上传软件包到/usr/local/src/
[root@node1 node-v8.2.1]# cd /usr/local/src/
[root@node1 src]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin
安装elasticsearch-head:
bash
[root@node1 bin]# cd /usr/local/src/
[root@node1 src]# tar xzvf elasticsearch-head.tar.gz
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
修改配置文件:
bash
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
# 末尾添加
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@node1 ~]# systemctl restart elasticsearch
启动head服务器:
bash
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
[1] 114729
Started connect web server on http://localhost:9100
[root@node1 elasticsearch-head]# netstat -lnput | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 114739/grunt
node2同样操作:安装node.js、phantomjs、elasticsearch-head,修改配置文件并启动。
验证结果:
浏览器打开 http://192.168.108.41:9100/,集群健康值显示"未连接"。在Elasticsearch后面的栏目输入 http://192.168.108.41:9200,点击连接,显示"集群健康值:green(0 of 0)"。
3.5 创建索引测试
bash
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' \
-H 'Content-Type: application/json' \
-d '{"user": "zhangsan", "msg": "hello world"}'
{
"_index": "index-demo",
"_type": "test",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"created": true
}
在浏览器 http://192.168.108.41:9100/ 查看索引信息,可以看到索引默认被分片5个,并且有一个副本。node1和node2是平等关系,不是主从关系。
点击"数据浏览",可以看到存储的数据。
四、安装Logstash
4.1 Apache主机准备
bash
# 关闭防火墙和SELinux
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# setenforce 0
# 安装Apache服务
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
# 查看日志
[root@apache ~]# cd /var/log/httpd/
[root@apache httpd]# ls
access_log error_log
# 安装Java环境
[root@apache ~]# java -version
openjdk version "1.8.0_262"
4.2 安装Logstash
bash
# 安装logstash
[root@apache ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
# 启动logstash
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service
# 建立logstash软连接
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
4.3 Logstash基础测试
测试1:标准输入输出
bash
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }'
# 输入 www.baidu.com
# 输出 2025-12-12T07:05:01.001Z apache www.baidu.com
# Ctrl+C退出
测试2:rubydebug详细输出
bash
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
# 输入 www.baidu.com
# 输出结构化JSON:
{
"@timestamp" => 2025-12-12T07:08:43.174Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
测试3:输出到Elasticsearch
bash
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
# 输入 www.baidu.com、www.360.cn、www.qq.com
# Ctrl+C退出
登录 http://192.168.108.41:9100/,多出 logstash-2025.12.12 索引(未命名,自动用时间后缀)。
4.4 配置Logstash采集系统日志
bash
# 修改日志文件权限
[root@apache ~]# chmod o+r /var/log/messages
# 编辑Logstash配置文件
[root@apache ~]# vim /etc/logstash/conf.d/system.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.108.41:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
# 重启logstash
[root@apache ~]# systemctl restart logstash.service
登录 http://192.168.108.41:9100/,多出 system-2025.12.12 索引。
4.5 配置Logstash采集Apache日志
bash
[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim apache_log.conf
input {
file {
path => "/var/log/httpd/access_log"
type => "access"
start_position => "beginning"
}
file {
path => "/var/log/httpd/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.108.41:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.108.41:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
访问 http://192.168.108.43 产生日志后,在 http://192.168.108.41:9100/ 可以看到 apache_access-2025.12.12 和 apache_error-2025.12.12 索引。
五、安装Kibana
5.1 安装Kibana(node1)
bash
# 安装kibana
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
# 修改配置文件
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
server.port: 5601 # kibana打开的端口
server.host: "0.0.0.0" # kibana侦听的地址
elasticsearch.url: "http://192.168.108.41:9200" # 和elasticsearch建立联系
kibana.index: ".kibana" # 在elasticsearch中添加.kibana索引
# 启动kibana
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
5.2 配置索引模式
浏览器访问 http://192.168.108.41:5601:
- 首次登录创建索引名字:
system-*(对接系统日志文件) - 点击创建按钮
- 点击左上角 Discover 按钮,可以看到 system-* 信息
- 点击 host 旁边的 add,再加一个 message,右面图显示 Time、host、message 三个选项
5.3 对接Apache日志索引
在Kibana中:
- 点击左下角 Management → Index Patterns → Create Index Pattern
- 分别创建
apache_access-*和apache_error-*的索引
5.4 创建可视化图表
创建柱状图(apache访问日志):
- 点击 Visualize → Create a Visualization
- 选择 Horizontal Bar
- 选择索引:
apache_access-* - 配置 Metrics:
- Y-Axis:Aggregation 选择 Count
- Custom Label:
apache访问日志数
- 配置 Buckets:
- X-Axis:Aggregation 选择 Date Histogram
- Field:@timestamp
- Interval:Auto
- Custom Label:时间
- 点击 Apply changes 查看图表
创建饼图(system日志):
- 选择 Pie
- 选择索引:
system-* - 配置 Metrics:Count
- 配置 Buckets:Split Slices,Aggregation 选择 Date Histogram
- 点击 Apply changes 查看饼图
5.5 创建仪表盘
- 点击 Dashboard → Create New Dashboard
- 点击 Add 按钮,添加之前创建的可视化组件
- 保存仪表盘
六、本章小结
本文系统讲解了ELK日志分析平台的完整部署流程:
| 章节 | 核心内容 |
|---|---|
| ELK概述 | Elasticsearch、Logstash、Kibana三大组件定位 |
| 环境配置 | 主机名、域名解析、Java环境 |
| Elasticsearch集群 | 2节点集群部署、健康检查、Head插件 |
| Logstash | 安装配置、系统日志采集、Apache日志采集 |
| Kibana | 安装配置、索引模式、可视化图表、仪表盘 |
核心结论:
- ELK是端到端的日志分析解决方案,收集、存储、可视化无缝衔接
- Elasticsearch擅长快速查找,不擅长频繁更新事务
- Logstash是数据流引擎,负责将杂乱数据"加工"成结构化数据
- Kibana是ELK的"面子",将深奥数据以图形方式呈现
- Beats是轻量级采集器,可替代Logstash的Input功能
- 集群健康状态:green(正常)、yellow(副本未分配)、red(主分片未分配)
- 索引默认5个分片+1个副本,node1和node2是平等关系
📌 核心命令速查
bash
# Elasticsearch管理
systemctl start/stop/restart elasticsearch
curl -XGET 'localhost:9200/_cluster/health?pretty'
curl -XPUT 'localhost:9200/index-name/type/id?pretty' -d '{...}'
# Logstash管理
systemctl start/stop/restart logstash
logstash -e 'input { stdin{} } output { stdout{} }'
logstash -f /etc/logstash/conf.d/xxx.conf
# Kibana管理
systemctl start/stop/restart kibana
# Web访问
http://<node1>:9200 # Elasticsearch API
http://<node1>:9100 # elasticsearch-head
http://<node1>:5601 # Kibana Web界面
# 索引模式
system-* # 系统日志
apache_access-* # Apache访问日志
apache_error-* # Apache错误日志
📝 本文首发于个人技术博客,欢迎交流讨论。如有错误,恳请指正。