文章目录
- ELK企业级日志分析系统:从零搭建集中化日志平台
- 前言
- 一、ELK概述
- 1.1 三大组件定位
- 1.2 ELK工作原理
- 1.3 Elasticsearch详解
- 1.4 Logstash详解
- 1.5 Kibana详解
- 二、案例环境配置
- 2.1 环境规划
- 2.2 准备主机名、域名、Java环境
- 三、部署Elasticsearch集群
- 3.1 安装Elasticsearch(node1)
- 3.2 安装Elasticsearch(node2)
- 3.3 集群健康检查
- 3.4 安装Elasticsearch-Head插件
- 3.5 创建索引测试
- 四、安装Logstash
- 4.1 Apache主机准备
- 4.2 安装Logstash
- 4.3 Logstash基础测试
- 4.4 配置Logstash采集系统日志
- 4.5 配置Logstash采集Apache日志
- 五、安装Kibana
- 5.1 安装Kibana(node1)
- 5.2 配置索引模式
- 5.3 对接Apache日志索引
- 5.4 创建可视化图表
- 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则是银行的数据分析和监控中心的大屏幕,通过图表、仪表盘、地图来可视化金融趋势、交易流水、风险状况
核心数据流:
日志/数据源 → Logstash(收集、处理) → Elasticsearch(存储、索引、搜索) → Kibana(可视化、分析)1.2 ELK工作原理
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):
# 配置域名解析[root@node1 ~]# vim /etc/hosts192.168.108.41 node1192.168.108.42 node2# 查看Java环境[root@node1 ~]# java -versionopenjdk version"1.8.0_262"OpenJDK Runtime Environment(build1.8.0_262-b10)OpenJDK64-Bit Server VM(build25.262-b10, mixed mode)node2(192.168.108.42):
# 配置域名解析[root@node2 ~]# vim /etc/hosts192.168.108.41 node1192.168.108.42 node2# 查看Java环境[root@node2 ~]# java -versionopenjdk version"1.8.0_262"三、部署Elasticsearch集群
3.1 安装Elasticsearch(node1)
# 安装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.ymlcluster.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 9200tcp600:::9200 :::* LISTEN64463/java验证:浏览器打开http://192.168.108.41:9200,可以看到节点信息:
{"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)
# 安装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.ymlcluster.name: my-elk-cluster node.name: node2 path.data: /data/elk_data path.logs: /var/log/elasticsearch/ bootstrap.memory_lock:falsenetwork.host:0.0.0.0 http.port:9200discovery.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 9200tcp600:::9200 :::* LISTEN64463/java验证:浏览器打开http://192.168.108.42:9200,可以看到node2节点信息。
3.3 集群健康检查
浏览器访问http://192.168.108.41:9200/_cluster/health?pretty:
{"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插件的基础环境):
# 安装编译依赖[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前端框架:
# 上传软件包到/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:
[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修改配置文件:
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml# 末尾添加http.cors.enabled:truehttp.cors.allow-origin:"*"[root@node1 ~]# systemctl restart elasticsearch启动head服务器:
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/[root@node1 elasticsearch-head]# npm run start &[1]114729Started connect web server on http://localhost:9100[root@node1 elasticsearch-head]# netstat -lnput | grep 9100tcp000.0.0.0:91000.0.0.0:* LISTEN114739/gruntnode2同样操作:安装node.js、phantomjs、elasticsearch-head,修改配置文件并启动。
验证结果:
浏览器打开http://192.168.108.41:9100/,集群健康值显示"未连接"。在Elasticsearch后面的栏目输入http://192.168.108.41:9200,点击连接,显示"集群健康值:green(0 of 0)"。
3.5 创建索引测试
[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主机准备
# 关闭防火墙和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]# lsaccess_log error_log# 安装Java环境[root@apache ~]# java -versionopenjdk version"1.8.0_262"4.2 安装Logstash
# 安装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:标准输入输出
[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详细输出
[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
[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采集系统日志
# 修改日志文件权限[root@apache ~]# chmod o+r /var/log/messages# 编辑Logstash配置文件[root@apache ~]# vim /etc/logstash/conf.d/system.confinput{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日志
[root@apache ~]# cd /etc/logstash/conf.d/[root@apache conf.d]# vim apache_log.confinput{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)
# 安装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.ymlserver.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.service5.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是平等关系
📌核心命令速查
# Elasticsearch管理systemctl start/stop/restart elasticsearchcurl-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 APIhttp://<node1>:9100# elasticsearch-headhttp://<node1>:5601# Kibana Web界面# 索引模式system-*# 系统日志apache_access-*# Apache访问日志apache_error-*# Apache错误日志📝 本文首发于个人技术博客,欢迎交流讨论。如有错误,恳请指正。