ELK 企业日志分析系统总结
一、ELK 核心概述
1. 核心定位
ELK 是开源实时日志分析平台,由 Elasticsearch、Logstash、Kibana 三大组件组成,解决分布式环境下日志分散存储、检索低效、分析困难等问题,提供 "收集 - 处理 - 存储 - 可视化" 端到端解决方案,广泛应用于日志分析、APM(应用性能监控)、SIEM(安全信息与事件管理)等场景。
2. 核心组件功能(银行系统类比)
| 组件 | 核心角色 | 核心功能 | 关键特性 |
|---|---|---|---|
| Elasticsearch | 大脑 / 心脏(金库) | 海量数据存储、索引、检索、分析 | 分布式高可用、毫秒级近实时搜索、倒排索引、RESTful API、聚合分析 |
| Logstash | 搬运工 / 预处理车间(柜台 + 运钞车) | 数据收集、过滤、转换、输送 | Input/Filter/Output 三段式流程、丰富插件、支持多源输入 / 多目标输出 |
| Kibana | 窗口 / 仪表盘(监控大屏) | 数据可视化、探索、交互管理 | 多类型图表(柱状图 / 折线图等)、仪表盘定制、索引管理、Lucene/KQL 查询支持 |
3. 核心工作流程
-
日志集中化收集(Beats 轻量收集或 Logstash 直接收集)
-
日志格式化处理(Logstash Filter 解析结构化数据)
-
索引与存储(Elasticsearch 分布式存储 + 倒排索引)
-
可视化展示(Kibana 图表 / 仪表盘呈现)
数据流:日志 / 数据源 → Logstash → Elasticsearch → Kibana → Browser
二、关键技术细节
1. Elasticsearch 核心能力
- 分布式存储:支持 PB 级数据,副本机制保障硬件故障时数据不丢失、服务不中断
- 搜索能力:全文搜索(模糊匹配、同义词处理、相关性评分),解决拼写错误、语义关联查询需求
- 索引技术:采用倒排索引(类似书籍索引页),查询速度远超传统逐行扫描
- 聚合分析:支持类似 SQL GROUP BY 的分组统计、95 百分位延迟计算、用户地理分布分析等
- 关键端口:9200(HTTP API 访问)、9300(集群节点间通信)
2. Logstash 核心流程
- Input:支持文件(*.log)、Syslog、Kafka、MySQL、TCP/UDP、HTTP 等多源实时收集
- Filter:核心处理环节,常用操作包括:
- Grok:通过正则模式解析复杂文本日志(如从 Apache 访问日志中提取 IP、时间、请求方法等字段)
- Mutate:重命名、删除、替换字段或转换数据类型
- Date:解析时间戳并设置为标准 @timestamp 字段
- GeoIP:根据 IP 地址补充国家、城市、经纬度信息
- Output:默认输出至 Elasticsearch,也支持 MongoDB、Kafka、文件、邮件等目标
- 轻量替代方案:Beats(Filebeat/Metricbeat),资源消耗更低,可直接发送数据到 ES 或 Logstash
3. Kibana 核心功能
- 数据探索(Discover):交互式查询原始数据,支持添加过滤器缩小范围
- 可视化(Visualize):生成柱状图、折线图、饼图、指标看板、坐标地图等
- 仪表盘(Dashboard):组合多个可视化组件,构建实时监控大屏
- 管理功能:索引生命周期管理(ILM)、用户权限控制、可视化模板导入导出
三、完整实施过程(CentOS7.9 环境,集群部署)
1. 实验环境准备
| 主机名 | IP 地址 | 操作系统 | 部署软件 | 核心作用 |
|---|---|---|---|---|
| node1 | 192.168.108.41 | CentOS7.9 | Elasticsearch、Kibana、elasticsearch-head | ES 集群主节点、Kibana 可视化服务、集群管理工具 |
| node2 | 192.168.108.42 | CentOS7.9 | Elasticsearch、elasticsearch-head | ES 集群从节点、集群管理工具 |
| apache | 192.168.108.43 | CentOS7.9 | Logstash、Apache | 产生 Apache 访问 / 错误日志、日志收集与格式化处理 |
2. 分步实施过程(重点步骤 + 命令)
(1)基础环境配置(所有节点)
-
配置域名解析:
bash# 编辑/etc/hosts文件,添加节点映射 vim /etc/hosts 192.168.108.41 node1 192.168.108.42 node2 -
验证 Java 环境(要求 1.8+):
bashjava -version # 需显示openjdk version "1.8.0_262"及以上
(2)Elasticsearch 集群部署(node1+node2)
-
安装 ES 软件:
bash# 上传elasticsearch-5.5.0.rpm到/opt目录 cd /opt rpm -ivh elasticsearch-5.5.0.rpm -
配置系统服务:
bashsystemctl daemon-reload systemctl enable elasticsearch.service # 开机自启 -
修改核心配置文件(elasticsearch.yml):
bashcp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak # 备份 vim /etc/elasticsearch/elasticsearch.yml cluster.name: my-elk-cluster # 集群名称(两节点一致) node.name: node1 # node2节点此处改为node2 path.data: /data/elk_data # 数据存储路径 path.logs: /var/log/elasticsearch/ # 日志存储路径 bootstrap.memory_lock: false # 不锁定物理内存(避免IOPS过高) network.host: 0.0.0.0 # 允许所有地址访问 http.port: 9200 # 监听端口 discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 单播发现集群节点 -
创建数据目录并授权:
bashmkdir -p /data/elk_data chown elasticsearch:elasticsearch /data/elk_data/ -
启动并验证:
bashsystemctl start elasticsearch.service netstat -antp | grep 9200 # 检查9200端口是否监听 # 浏览器访问http://192.168.108.41:9200,显示节点信息则成功 # 检查集群健康状态(green为正常) curl http://192.168.108.41:9200/_cluster/health?pretty
(3)elasticsearch-head 插件安装(node1+node2,集群可视化)
-
安装依赖环境:
bashyum install gcc gcc-c++ make -y # 安装编译工具 # 上传node-v8.2.1.tar.gz到/opt,编译安装Node.js cd /opt tar xzvf node-v8.2.1.tar.gz cd node-v8.2.1/ ./configure && make -j4 && make install # 编译耗时约20分钟 # 上传phantomjs-2.1.1-linux-x86_64.tar.bz2到/usr/local/src cd /usr/local/src/ tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2 cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/ -
安装 head 插件:
bash# 上传elasticsearch-head.tar.gz到/usr/local/src cd /usr/local/src/ tar xzvf elasticsearch-head.tar.gz cd elasticsearch-head/ npm install # 安装插件依赖 -
配置 ES 跨域访问(支持 head 连接):
bashvim /etc/elasticsearch/elasticsearch.yml # 末尾添加 http.cors.enabled: true # 开启跨域 http.cors.allow-origin: "*" # 允许所有域名访问 systemctl restart elasticsearch.service # 重启ES -
启动 head 插件并验证:
bashcd /usr/local/src/elasticsearch-head/ npm run start & # 后台运行 netstat -lnupt | grep 9100 # 检查9100端口 # 浏览器访问http://192.168.108.41:9100,输入ES地址http://192.168.108.41:9200,显示集群健康值green则成功
(4)Logstash 部署与配置(apache 节点)
-
安装依赖与基础服务:
bash# 安装Apache(产生日志) yum -y install httpd systemctl start httpd && systemctl enable httpd # 验证Java环境(同前) java -version -
安装 Logstash:
bash# 上传logstash-5.5.1.rpm到/opt cd /opt rpm -ivh logstash-5.5.1.rpm systemctl start logstash.service && systemctl enable logstash.service ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ # 建立软连接 -
Logstash 功能测试:
-
标准输入输出测试(验证服务可用性):
bashlogstash -e 'input { stdin{} } output { stdout{} }' # 输入www.baidu.com,输出带时间戳的日志则正常 -
详细输出测试(rubydebug 格式):
bashlogstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }' # 输入内容后显示结构化字段(@timestamp、host、message) -
对接 ES 测试(数据写入 ES):
bashlogstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }' # 输入多条内容后,在head插件中查看是否生成logstash-日期索引
-
-
配置日志收集(系统日志 + Apache 日志):
-
系统日志配置(/etc/logstash/conf.d/system.conf):
bashchmod o+r /var/log/messages # 授权Logstash读取系统日志 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}" # 索引名按日期命名 } } -
Apache 日志配置(/etc/logstash/conf.d/apache_log.conf):
bashvim /etc/logstash/conf.d/apache_log.conf input { file{ path => "/etc/httpd/logs/access_log" # Apache访问日志 type => "access" start_position => "beginning" } file{ path => "/etc/httpd/logs/error_log" # Apache错误日志 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}" } } }
-
-
重启 Logstash 生效:
bashsystemctl restart logstash.service
(5)Kibana 部署与可视化(node1 节点)
-
安装 Kibana:
bash# 上传kibana-5.5.1-x86_64.rpm到/usr/local/src cd /usr/local/src/ rpm -ivh kibana-5.5.1-x86_64.rpm -
修改配置文件(kibana.yml):
bashcd /etc/kibana/ cp kibana.yml kibana.yml.bak # 备份 vim kibana.yml server.port: 5601 # Kibana访问端口 server.host: "0.0.0.0" # 允许所有地址访问 elasticsearch.url: "http://192.168.108.41:9200" # 关联ES集群 kibana.index: ".kibana" # 在ES中创建的索引名 -
启动并验证:
bashsystemctl start kibana.service && systemctl enable kibana.service # 浏览器访问http://192.168.108.41:5601,进入Kibana界面则成功 -
日志可视化配置:
- 创建索引模式:Management → Index Patterns → Create index pattern
- 系统日志:输入 system-*,选择时间字段 @timestamp,点击 Create
- Apache 访问日志:输入 apache_access-*,同上
- Apache 错误日志:输入 apache_error-*,同上
- 查看日志:点击 Discover,选择对应索引模式,即可查看结构化日志(时间、主机、日志内容等)
- 构建仪表盘:Visualize 创建图表 → Dashboard 组合多个图表,实现实时监控
- 创建索引模式:Management → Index Patterns → Create index pattern
3. 关键验证结果
- ES 集群:2 个节点正常加入,集群状态 green,索引自动分片(默认 5 个分片 + 1 个副本)
- Logstash:成功收集系统日志、Apache 访问 / 错误日志,ES 中生成对应日期索引
- Kibana:可通过索引模式筛选日志,生成直观图表,支持按字段过滤、排序
四、核心优势与实施注意事项
1. 核心优势
- 集中化:解决多服务器日志分散问题,无需逐台登录查看
- 高效性:毫秒级检索、分布式存储,支持海量数据处理
- 易用性:可视化界面降低分析门槛,无需复杂 Linux 命令
- 扩展性:支持集群横向扩展,适应业务增长
2. 注意事项
- Elasticsearch:避免频繁更新数据(非事务型数据库),合理规划索引生命周期
- Logstash:资源消耗较高,轻量场景用 Beats 替代 Input;Filter 配置需优化正则效率
- 集群部署:确保节点间网络连通,集群名称一致,跨域配置仅用于测试环境(生产需限制域名)
- 权限控制:生产环境需配置 ES/Kibana 用户认证,避免未授权访问
- 存储规划:根据日志量预留足够磁盘空间,定期清理过期索引