☰
ELK企业级日志分析系统:从零搭建集中化日志平台
2026/10/22 13:14:58 网站建设 项目流程

文章目录

  • 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

完整处理流程:

  1. Filebeat将日志进行集中化管理(beats家族),替代Logstash采集端
  2. Logstash将日志格式化
  3. Elasticsearch对格式化后的数据进行索引和存储
  4. 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.9node1192.168.108.41Elasticsearch + Kibana
服务器CentOS 7.9node2192.168.108.42Elasticsearch
服务器CentOS 7.9apache192.168.108.43Logstash + 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/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 创建索引测试

[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.service

5.2 配置索引模式

浏览器访问http://192.168.108.41:5601:

  1. 首次登录创建索引名字:system-*(对接系统日志文件)
  2. 点击创建按钮
  3. 点击左上角 Discover 按钮,可以看到 system-* 信息
  4. 点击 host 旁边的 add,再加一个 message,右面图显示 Time、host、message 三个选项

5.3 对接Apache日志索引

在Kibana中:

  • 点击左下角Management → Index Patterns → Create Index Pattern
  • 分别创建apache_access-*和apache_error-*的索引

5.4 创建可视化图表

创建柱状图(apache访问日志):

  1. 点击Visualize → Create a Visualization
  2. 选择Horizontal Bar
  3. 选择索引:apache_access-*
  4. 配置 Metrics:
    • Y-Axis:Aggregation 选择 Count
    • Custom Label:apache访问日志数
  5. 配置 Buckets:
    • X-Axis:Aggregation 选择 Date Histogram
    • Field:@timestamp
    • Interval:Auto
    • Custom Label:时间
  6. 点击Apply changes查看图表

创建饼图(system日志):

  1. 选择Pie
  2. 选择索引:system-*
  3. 配置 Metrics:Count
  4. 配置 Buckets:Split Slices,Aggregation 选择 Date Histogram
  5. 点击Apply changes查看饼图

5.5 创建仪表盘

  1. 点击Dashboard → Create New Dashboard
  2. 点击Add按钮,添加之前创建的可视化组件
  3. 保存仪表盘

六、本章小结

本文系统讲解了ELK日志分析平台的完整部署流程:

章节核心内容
ELK概述Elasticsearch、Logstash、Kibana三大组件定位
环境配置主机名、域名解析、Java环境
Elasticsearch集群2节点集群部署、健康检查、Head插件
Logstash安装配置、系统日志采集、Apache日志采集
Kibana安装配置、索引模式、可视化图表、仪表盘

核心结论:

  1. ELK是端到端的日志分析解决方案,收集、存储、可视化无缝衔接
  2. Elasticsearch擅长快速查找,不擅长频繁更新事务
  3. Logstash是数据流引擎,负责将杂乱数据"加工"成结构化数据
  4. Kibana是ELK的"面子",将深奥数据以图形方式呈现
  5. Beats是轻量级采集器,可替代Logstash的Input功能
  6. 集群健康状态:green(正常)、yellow(副本未分配)、red(主分片未分配)
  7. 索引默认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错误日志

📝 本文首发于个人技术博客,欢迎交流讨论。如有错误,恳请指正。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询