ELK 企业日志分析系统详细介绍与总结
一、文档概述
本文档全面讲解了 ELK 企业日志分析系统,包括其核心组件、工作原理、部署配置流程及实际应用案例。ELK 由 Elasticsearch、Logstash 和 Kibana 三个开源工具组成,旨在解决分布式环境下日志分散存储、检索低效等问题,提供日志集中收集、格式化处理、索引存储、可视化分析的端到端解决方案,广泛应用于日志分析、应用性能监控、安全信息与事件管理等领域。
二、核心组件介绍
(一)Elasticsearch:分布式搜索和分析引擎
-
核心角色:系统的 "大脑和心脏",负责海量数据的存储、检索和分析。
-
关键特性
:
- 分布式存储与高可用:支持 PB 级数据存储,通过副本机制避免数据丢失和服务中断。
- 近乎实时搜索:数据写入后毫秒级可检索,适配实时监控场景。
- 强大全文搜索:基于 Apache Lucene,支持模糊搜索、同义词处理、相关性评分。
- 倒排索引技术:查询速度远超传统逐行扫描数据库。
- 丰富 RESTful API:便于与其他系统集成。
- 聚合分析能力:支持类似 SQL GROUP BY 的复杂统计分析(如按应用分组统计错误日志、计算访问延迟百分位等)。
(二)Logstash:服务器端数据处理管道
-
核心角色:数据的 "搬运工和预处理车间",负责收集、解析、转换和输送数据。
-
工作流程
:Input(输入)→ Filter(过滤)→ Output(输出)
- Input:支持文件、系统日志、消息队列、数据库、网络协议等多种数据源。
- Filter:核心功能,将非结构化日志解析为结构化数据,常用插件包括 Grok(正则解析)、Mutate(字段修改)、Date(时间戳解析)、GeoIP(IP 地址解析)、KV(key=value 解析)。
- Output:将处理后的数据输出至 Elasticsearch、数据库、消息队列等目的地。
-
补充说明:轻量级场景下可使用 Beats(如 Filebeat)替代其 Input 功能,降低资源消耗。
(三)Kibana:数据可视化与管理平台
-
核心角色:系统的 "窗口和仪表盘",提供数据探索、可视化和交互功能。
-
主要功能
:
- 数据探索(Discover):支持 Lucene/KQL 查询语法,可动态过滤数据并查看详细文档。
- 可视化(Visualize):提供柱状图、折线图、饼图、指标看板、地图等多种图表组件。
- 仪表盘(Dashboard):可组合多个可视化组件,实现系统状态、性能指标的全局监控。
- 系统管理:支持索引生命周期管理、用户权限控制、可视化配置导入 / 导出等。
三、部署环境与拓扑
(一)环境说明
| 主机名 | IP 地址 | 操作系统 | 主要安装软件 | 服务端口 |
|---|---|---|---|---|
| node1 | 192.168.108.41 | CentOS7.9 | Elasticsearch、Kibana | 9200(ES)、5601(Kibana) |
| node2 | 192.168.108.42 | CentOS7.9 | Elasticsearch | 9200(ES) |
| apache | 192.168.108.43 | CentOS7.9 | Logstash、Apache(httpd) | 9600(Logstash) |
(二)拓扑流程
【APPServer 集群(Apache)】→【Logstash Agent 采集器】→【Elasticsearch Cluster(node1+node2)】→【Kibana Server】→【Browser】
四、详细部署步骤(含代码示例)
(一)前置准备:配置 Java 环境与域名解析
所有节点需安装 Java 1.8 + 环境,以 node1 为例:
bash
# 查看Java版本(需确保输出openjdk version "1.8.0_262"及以上)
[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)
# 配置域名解析(node1和node2均需执行)
[root@node1 ~]# vi /etc/hosts
# 添加以下两行
192.168.108.41 node1
192.168.108.42 node2
(二)部署 Elasticsearch 集群(node1+node2)
1. 安装 Elasticsearch(以 node1 为例,node2 步骤一致)
bash
# 上传安装包至/opt目录,执行安装
[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
# 加载系统服务并设置开机自启
[root@node1 opt]# systemctl daemon-reload
[root@node1 opt]# systemctl enable elasticsearch.service
# 备份并修改主配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
# 关键配置(修改或添加以下内容)
cluster.name: my-elk-cluster # 集群名称(node1和node2需一致)
node.name: node1 # 节点名称(node2需改为node2)
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/
# 启动服务并验证
[root@node1 opt]# systemctl start elasticsearch.service
[root@node1 opt]# netstat -antp | grep 9200 # 查看9200端口是否监听
tcp6 0 0 :::9200 :::* LISTEN 64463/java
# 浏览器访问验证(返回节点信息即成功)
http://192.168.108.41:9200
2. 集群健康状态检查
bash
# 浏览器访问集群健康接口(status为green表示正常)
http://192.168.108.41:9200/_cluster/health?pretty
# 返回结果示例
{
"cluster_name" : "my-elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_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
}
(三)安装 elasticsearch-head 插件(集群管理工具)
1. 安装依赖环境(node1 和 node2 均需执行)
bash
# 安装编译依赖
[root@node1 ~]# yum install gcc gcc-c++ make -y
# 安装Node.js(elasticsearch-head运行基础)
[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 # 编译耗时较长(约20分钟)
[root@node1 node-v8.2.1]# make install
# 安装PhantomJS(前端渲染依赖)
[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
2. 安装并启动 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 # 安装依赖包
# 修改Elasticsearch配置以支持跨域访问
[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
# 末尾添加以下配置
http.cors.enabled: true
http.cors.allow-origin: "*"
# 重启Elasticsearch
[root@node1 elasticsearch-head]# systemctl restart elasticsearch
# 启动elasticsearch-head(后台运行)
[root@node1 elasticsearch-head]# npm run start &
# 输出示例
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
# 验证端口监听
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 114739/grunt
3. 验证插件连接
浏览器访问 http://192.168.108.41:9100,在输入框中填写 http://192.168.108.41:9200 并点击 "连接",显示集群健康值为 green 即成功。
(四)部署 Logstash(apache 节点)
1. 前置准备
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 ~]# systemctl enable httpd
# 验证Java环境
[root@apache ~]# 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)
2. 安装并配置 Logstash
bash
# 安装Logstash
[root@apache ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ # 建立软连接
# 测试Logstash基本功能(标准输入→标准输出)
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
# 输入测试内容,输出示例
www.baidu.com
2025-12-12T07:05:01.001Z apache www.baidu.com
www.sina.com.cn
2025-12-12T07:05:08.375Z apache www.sina.com.cn
# 按Ctrl+C退出
# 测试结构化输出(rubydebug格式)
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
# 输入www.baidu.com,输出示例
{
"@timestamp" => 2025-12-12T07:08:43.174Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
# 测试对接Elasticsearch(输入数据写入ES)
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
# 输入测试数据
www.baidu.com
www.360.cn
www.qq.com
# 浏览器访问elasticsearch-head,可看到生成logstash-2025.12.12索引
3. 配置 Logstash 收集系统日志和 Apache 日志
bash
# 配置收集系统日志(/var/log/messages)
[root@apache ~]# chmod o+r /var/log/messages # 赋予读权限
[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}"
}
}
# 配置收集Apache日志(访问日志和错误日志)
[root@apache ~]# vim /etc/logstash/conf.d/apache_log.conf
# 配置内容
input {
file{
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/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}"
}
}
}
# 重启Logstash使配置生效
[root@apache ~]# systemctl restart logstash.service
(五)部署 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 # 监听端口
server.host: "0.0.0.0" # 绑定所有IP
elasticsearch.url: "http://192.168.108.41:9200" # 连接ES集群
kibana.index: ".kibana" # Kibana自身索引
# 启动Kibana并设置开机自启
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
配置 Kibana 索引模式(可视化日志)
-
浏览器访问
http://192.168.108.41:5601,首次登录创建索引模式:
- 输入
system-*,选择时间字段@timestamp,点击 "Create" 创建系统日志索引。 - 同理创建
apache_access-*和apache_error-*索引模式。
- 输入
-
点击左侧 "Discover",选择对应索引模式,即可查看结构化的日志数据,支持过滤、搜索等操作。
五、总结
(一)核心优势
- 集中化管理:解决分布式环境下日志分散问题,无需逐台登录服务器查看日志。
- 高效检索:Elasticsearch 的倒排索引技术实现毫秒级日志检索,支持复杂查询条件。
- 可视化分析:Kibana 提供直观的图表和仪表盘,降低数据分析门槛。
- 高可用性:Elasticsearch 集群部署 + 副本机制,确保服务稳定和数据安全。
(二)关键部署要点
- 环境依赖:所有组件均需 Java 1.8 + 环境,elasticsearch-head 依赖 Node.js 和 PhantomJS。
- 配置一致性:Elasticsearch 集群节点需保持集群名称、发现机制配置一致。
- 权限与路径:数据目录需赋予对应服务用户权限,避免启动失败。
- 索引管理:通过 Logstash 配置按日期生成索引,便于日志归档和清理。