ELK 企业日志分析系统
ELK 企业日志分析系统
一、ELK 基础概述
1.1 日志分析背景
日志分为三类:系统日志、应用日志、安全日志
传统日志痛点:
- 日志分散在多台服务器,逐台登录查看效率极低;
- 使用
grep/awk/wc做检索统计,海量数据下性能不足; - 无统一可视化界面,故障排查、指标统计不直观。
解决方案:ELK Stack(Elastic Stack)集中式日志平台
1.2 ELK 三大组件核心介绍
| 组件 | 定位 | 核心作用 |
|---|---|---|
| Elasticsearch(ES) | 分布式搜索引擎、存储引擎 | 存储结构化日志、毫秒级全文检索、聚合统计、分布式高可用 |
| Logstash | 服务器端数据处理管道 | 日志采集、清洗、格式化、字段转换,统一输出至 ES |
| Kibana | Web 可视化平台 | 日志查询、图表展示、监控仪表盘、集群管理 |
通俗类比理解
- Logstash:银行运钞 / 柜台,收集、分拣、整理数据;
- Elasticsearch:银行智能金库,海量存储 + 快速索引查询;
- Kibana:监控大屏,可视化流水、风险、业务数据。
1.3 补充组件 Filebeat
Logstash 采集端资源消耗高,生产环境通常使用 Filebeat(Beats 轻量采集器) 替代采集环节,流程优化:
应用日志 → Filebeat采集 → Logstash清洗 → Elasticsearch存储索引 → Kibana可视化
1.4 ELK 标准数据流
原始日志 → Logstash(Input 采集→Filter 清洗→Output 输出)→ Elasticsearch(存储 + 倒排索引检索)→ Kibana(图表 / 仪表盘展示)
1.5 各组件详细功能
(1)Elasticsearch 核心能力
- 分布式高可用:数据分片 + 副本机制,单节点故障不丢数据、服务不中断,支持 PB 级数据;
- 近实时检索:数据写入后 1 秒内可查询,适配实时告警监控;
- 强大全文检索:基于 Lucene,支持模糊搜索、同义词、相关性打分;
- 倒排索引:类比书籍目录,查询速度远高于传统数据库逐行扫描;
- RESTful API:所有增删改查、集群管理均可 HTTP 调用,易集成;
- 聚合分析:等价 SQL GROUP BY,统计访问量、错误数、延迟分位数、地理分布等。
短板:不适合高频事务更新场景(MySQL 优势),擅长海量日志过滤、检索、统计。
(2)Logstash 三阶段流水线 Input→Filter→Output
-
Input(采集)
支持文件、syslog、Kafka/Redis 消息队列、MySQL、TCP/UDP、Beats 等多数据源。
-
Filter(清洗,核心)
- Grok:正则解析非结构化日志,拆分 IP、时间、请求码、接口等字段;
- Mutate:字段重命名、删除、类型转换;
- Date:统一日志时间戳为
@timestamp; - GeoIP:IP 解析归属地、经纬度;
- KV:解析
key=value格式日志。
-
Output(输出)
主流输出 ES,也支持 MongoDB、Kafka、本地文件、邮件、监控告警系统。
特点:功能全面,但资源开销大;轻量采集优先 Filebeat。
(3)Kibana 可视化平台
- Discover:交互式日志检索,支持 KQL/Lucene 语法筛选原始日志;
- Visualize:生成折线图、柱状图、饼图、地图、热力图、指标卡片;
- Dashboard:多图表组合大屏,实时监控系统健康、业务指标;
- Stack Management:索引生命周期 ILM、用户权限、仪表盘导入导出、集群配置。
1.6 ELK 应用场景
日志故障排查、应用性能监控 APM、安全日志审计 SIEM、业务流量指标分析。
二、实验环境规划
2.1 服务器清单
| 主机名 | 系统 | IP 地址 | 部署软件 | 端口 |
|---|---|---|---|---|
| node1 | CentOS7.9 | 192.168.108.41 | Elasticsearch、Kibana、elasticsearch-head | ES:9200、Kibana:5601、head:9100 |
| node2 | CentOS7.9 | 192.168.108.42 | Elasticsearch、elasticsearch-head | ES:9200、head:9100 |
| apache | CentOS7.9 | 192.168.108.43 | Apache httpd、Logstash | Logstash API:9600 |
2.2 实验目标
- 搭建双节点 Elasticsearch 集群;
- 部署 head 可视化插件管理 ES 集群;
- Logstash 采集 Apache 访问 / 错误日志、系统日志;
- Kibana 创建索引模式,可视化日志数据。
三、Elasticsearch 集群部署(node1+node2)
3.1 前置环境准备(两台 ES 节点均操作)
1. 主机名与域名解析
vim /etc/hosts
# 添加两行
192.168.108.41 node1
192.168.108.42 node2
2. Java 环境校验(ES5.5 依赖 JDK1.8)
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)
3.2 ES 安装配置(node1、node2 操作一致)
- 上传
elasticsearch-5.5.0.rpm至/opt,安装
cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
# 加载系统服务、开机自启
systemctl daemon-reload
systemctl enable elasticsearch.service
- 备份主配置文件并修改
cp /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/ # ES自身日志目录
bootstrap.memory_lock: false # 关闭内存锁定,避免swap
network.host: 0.0.0.0 # 监听所有网卡
http.port: 9200 # ES对外服务端口
discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 集群节点单播发现
# 后续安装head插件追加跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
- 创建数据目录并授权(ES 进程运行用户为 elasticsearch)
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/
- 启动 ES 并验证端口
systemctl start elasticsearch.service
netstat -antp | grep 9200
-
单节点访问验证(浏览器打开)
http://192.168.108.41:9200/
http://192.168.108.42:9200返回 JSON 包含节点名、集群名即启动成功。
3.3 ES 集群状态校验
-
集群健康状态(green 代表正常)
http://192.168.108.41:9200/_cluster/health?pretty关键字段:
status: green集群健康number_of_nodes: 2识别 2 个节点
-
集群完整状态信息
http://192.168.108.41:9200/_cluster/state?pretty可查看所有节点、master 主节点信息。
3.4 elasticsearch-head 集群可视化插件(node1、node2 均部署)
1. 依赖环境 Node.js 编译安装
# 安装编译依赖
yum install gcc gcc-c++ make -y
cd /opt
tar xzvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j4
make install
2. PhantomJS 无界面浏览器依赖
cd /usr/local/src/
tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin
3. 安装 head 插件源码
cd /usr/local/src/
tar xzvf elasticsearch-head.tar.gz
cd elasticsearch-head/
npm install # 安装前端依赖
4. 修改 ES 配置开启跨域(前文已配置,重启 ES 生效)
systemctl restart elasticsearch
5. 后台启动 head 服务(端口 9100)
cd /usr/local/src/elasticsearch-head/
npm run start &
# 验证端口
netstat -lnupt | grep 9100
6. head 使用验证
浏览器访问 http://IP:9100,连接地址填写 http://IP:9200,集群健康值 green、显示双节点即正常。
3.5 ES 索引写入测试(node1 执行)
curl -XPUT 'localhost:9200/index-demo/test/1?pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
返回created:true代表索引创建成功,在 head 页面可查看分片、副本、文档数据。
四、Logstash 部署与日志采集(apache 节点 192.168.108.43)
4.1 前置操作
- 关闭防火墙、selinux;
- 安装 Apache httpd 服务
yum -y install httpd
systemctl start httpd
# Apache日志路径
/var/log/httpd/access_log # 访问日志
/var/log/httpd/error_log # 错误日志
- JDK1.8 环境校验(同 ES 节点)
4.2 Logstash 安装
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/
4.3 Logstash 基础测试命令
- 标准输入→标准输出(最简管道测试)
logstash -e 'input { stdin{} } output { stdout{} }'
# 输入文字会自动输出带时间、主机字段日志
- rubydebug 格式化输出,查看完整结构化字段
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
- 标准输入直接写入 ES 集群
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
输入内容后,head 页面自动生成按日期命名索引logstash-yyyy.MM.dd。
4.4 Logstash 持久化配置文件规范
配置文件存放目录:/etc/logstash/conf.d/,结构固定三段:input{}、filter{}(可选)、output{}
案例 1:采集系统日志 /var/log/messages
chmod o+r /var/log/messages # 赋予读取权限
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 生效:
systemctl restart logstash.service
head 页面出现system-年月日索引即采集成功。
案例 2:采集 Apache 访问 + 错误日志(多文件区分 type)
vim /etc/logstash/conf.d/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}"
}
}
}
测试配置语法:
/usr/share/logstash/bin/logstash -f apache_log.conf -t
启动后访问 Apache 页面产生日志,head 可见apache_access-xxx、apache_error-xxx索引。
五、Kibana 可视化部署(node1 192.168.108.41)
5.1 Kibana 安装配置
- 上传
kibana-5.5.1-x86_64.rpm至/usr/local/src
cd /usr/local/src/
rpm -ivh kibana-5.5.1-x86_64.rpm
# 备份配置
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
vim /etc/kibana/kibana.yml
- 核心配置项
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.108.41:9200"
kibana.index: ".kibana" # Kibana自身配置存储索引
- 启动服务
systemctl start kibana.service
systemctl enable kibana.service
- 访问地址:
http://192.168.108.41:5601
5.2 Kibana 索引模式创建(核心操作)
索引模式用于匹配 ES 中同类日志索引,以*通配日期后缀:
- 左侧菜单
Management→Index Patterns→Create index pattern - 分别创建三类索引:
system-*:系统日志apache_access-*:Apache 访问日志apache_error-*:Apache 错误日志
- Time Filter field name 选择
@timestamp(日志标准时间字段),点击 Create 完成。
5.3 日志检索与可视化
- Discover:切换对应索引模式,按时间筛选、搜索关键字查看原始日志;
- Visualize:基于索引创建折线图、饼图、访问量指标、错误统计;
- Dashboard:将多个图表整合为监控大屏,实时观测日志状态。
六、整体实验流程总结
- 环境初始化:配置 hosts、JDK1.8;
- 双节点 ES 集群部署,开启跨域,安装 head 插件管理集群;
- Apache 节点部署 Logstash,编写多套采集配置(系统日志、Apache 日志);
- node1 部署 Kibana,对接 ES 集群,创建索引模式;
- 生成业务日志,在 Kibana 检索、可视化分析日志。
七、常见知识点总结
- ES 是分布式存储检索引擎,靠倒排索引实现高速查询;
- Logstash 三阶段:Input 采集、Filter 清洗、Output 输出,生产多用 Filebeat 轻量化采集;
- head 插件仅用于 ES 集群简易管理,生产环境优先 Kibana;
- Kibana 通过索引模式匹配 ES 按日期滚动的日志索引;
- ES 集群双节点为对等节点,无严格主从,副本机制保障数据安全;
- Logstash 支持条件输出,可按日志类型拆分不同索引,方便 Kibana 分类查看。
更多推荐




所有评论(0)