企业级 ELK 日志分析系统
ELK 是目前企业最主流的集中式日志收集、清洗、存储、检索、可视化一站式解决方案,广泛用于运维监控、故障排查、安全审计、业务分析等场景。本文基于 CentOS 7 + ELK 5.5 版本,从核心原理、组件作用、双节点 ES 集群、Logstash 配置、Kibana 可视化全流程讲解,可直接用于学习与生产环境搭建。
一、ELK 是什么?核心三组件
ELK 是 Elastic 公司开源的三大套件组合,现在官方叫 Elastic Stack,包含:
- E → Elasticsearch(分布式搜索引擎 / 存储)
- L → Logstash(数据采集 / 清洗 / 转换)
- K → Kibana(可视化界面 / 报表 / 大盘)
现在企业架构普遍升级为:
FileBeat (轻量采集) → Logstash (清洗) → Elasticsearch (存储) → Kibana (展示)
1. Elasticsearch(大脑 / 仓库)
- 定位:分布式、高可用、近实时搜索分析引擎
- 基于 Lucene,支持 RESTful API
- 自动分片、副本、负载均衡
- 作用:存储结构化日志、提供毫秒级查询、支持聚合统计
- 端口:9200(HTTP)9300(集群通信)
2. Logstash(搬运工 / 加工厂)
- 定位:数据采集处理管道(Input → Filter → Output)
- 支持多源输入:文件、Syslog、Kafka、Beats、DB 等
- Filter 强大:Grok 解析、字段改名、时间格式化、GeoIP
- 作用:把杂乱日志 → 结构化 JSON
- 缺点:较重,生产前端建议用 FileBeat 替代采集
3. Kibana(窗口 / 仪表盘)
- 可视化 Web 平台
- 功能:Discover 查询、Visualize 图表、Dashboard 大盘
- 对接 ES,无需写代码即可做日志分析
- 端口:5601
二、标准 ELK 工作流程
- 产生日志:Apache、Nginx、系统日志、应用业务日志
- 采集日志:FileBeat/Logstash Agent 收集
- 清洗格式化:Logstash 过滤、解析、切字段
- 入库存储:写入 Elasticsearch 建立索引
- 查询展示:Kibana 做搜索、图表、告警、大屏
三、实验环境规划(双节点 ES 集群)
| 主机名 | IP | 角色 | 安装软件 |
|---|---|---|---|
| node1 | 192.168.108.41 | ES 主节点、Kibana | Elasticsearch、Kibana、head 插件 |
| node2 | 192.168.108.42 | ES 从节点 | Elasticsearch、head 插件 |
| apache | 192.168.108.43 | 日志源 | Apache、Logstash |
基础要求:
- CentOS 7.9
- JDK 1.8(ELK 必需)
- 关闭防火墙、SELinux
- 主机名 /hosts 解析配置正确
四、Elasticsearch 双节点集群部署
1. 配置 hosts(所有节点)
bash
192.168.108.41 node1
192.168.108.42 node2
2. 安装 ES(rpm 方式)
bash
rpm -ivh elasticsearch-5.5.0.rpm
3. 主配置文件 elasticsearch.yml
yaml
cluster.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
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1","node2"]
# 跨域支持(给 head 插件用)
http.cors.enabled: true
http.cors.allow-origin: "*"
4. 创建数据目录并授权
bash
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data
5. 启动并设置开机自启
bash
systemctl start elasticsearch
systemctl enable elasticsearch
6. 集群检查
- 访问:http://192.168.108.41:9200
- 健康检查:http://192.168.108.41:9200/_cluster/health?pretty
- status: green 表示集群健康
五、安装 elasticsearch-head 可视化管理工具
作用:网页查看 ES 集群状态、索引、分片、数据
依赖:Node.js + PhantomJS
安装完成后访问:
输入 ES 地址:http://192.168.108.41:9200
显示 green 即成功。
六、Logstash 部署
安装在日志源端(192.168.108.43 apache)
1. 安装
bash
rpm -ivh logstash-5.5.1.rpm
2. 三大核心模块
- input(输入:文件、Beats、Syslog)
- filter(过滤:Grok、mutate、date)
- output(输出:ES、Kafka、File)
3. 测试 Logstash 功能
bash
# 控制台输入输出
logstash -e 'input { stdin{} } output { stdout{} }'
# 输出 JSON 格式
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
# 直接输出到 ES
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
4. 收集系统日志配置示例
/etc/logstash/conf.d/system.conf
bash
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.108.41:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
5. 收集 Apache 访问 / 错误日志
/etc/logstash/conf.d/apache_log.conf
bash
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}" }
}
}
七、Kibana 部署(可视化展示)
安装在 node1:
1. 安装
bash
rpm -ivh kibana-5.5.1-x86_64.rpm
2. 配置 kibana.yml
yaml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.108.41:9200"
kibana.index: ".kibana"
3. 启动
bash
systemctl start kibana
4. Kibana 使用步骤
- 配置 Index Pattern(如 system-、apache_access-、apache_error-*)
- 选择时间字段 @timestamp
- 进入 Discover 查看日志
- 创建可视化图表 → 组合成 Dashboard 大盘
八、企业 ELK 必知必会
1. 为什么要用 FileBeat?
-
Logstash 占内存高
-
FileBeat 超轻量(Go 语言)
-
适合在大量业务机部署采集
-
标准架构:
FileBeat → Kafka → Logstash → ES → Kibana
2. ES 集群重要概念
- 分片 Shard:数据切分,提高并发
- 副本 Replica:备份,提高可用性
- 索引 Index:类似 MySQL 库
- 类型 Type:类似 MySQL 表
- 文档 Document:JSON 数据
3. 生产优化要点
- ES 内存不超过 32G
- 开启内存锁定
- 索引按天拆分,设置生命周期(ILM)
- 使用 SSD 磁盘
- 禁止 ES 用 root 运行
- 大规模加 Kafka 削峰
4. 典型应用场景
- 服务器系统日志集中管理
- Nginx/Apache 访问日志分析
- Java 应用异常日志检索
- Docker/K8s 容器日志收集
- 安全审计、登录日志、操作日志
- 业务埋点、UV/PV 统计、接口耗时分析
九、ELK 常见问题排查
适用于:Elasticsearch 5.x/6.x/7.x + Logstash + Kibana
一句话原则:先看日志 → 再查端口 → 最后看配置与权限
(一)Elasticsearch 启动失败 / 集群异常
1. ES 进程起不来
-
查看日志:
tail -f /var/log/elasticsearch/<集群名>.log -
常见原因:
- JDK 版本不对(必须 JDK8,高版本 ES 需 JDK11+)
- 内存不足:
/etc/elasticsearch/jvm.options堆内存过大 - 数据目录权限不对:必须
elasticsearch:elasticsearch - 端口 9200/9300 被占用
cluster.name或node.name配置错误discovery.zen.ping.unicast.hosts集群地址写错
2. 集群状态 yellow /red(不是 green)
-
green:正常
-
yellow:副本未分配(节点不足)
-
red:主分片未分配(数据丢失 / 节点挂了)
-
排查:
- 检查所有节点是否在线
- 检查防火墙 /hosts 解析
- 检查分片数 > 节点数导致副本无法分配
- 接口查看:
http://ip:9200/_cluster/health?pretty
3. head 插件连不上 ES
-
ES 未开启跨域:
bashhttp.cors.enabled: true http.cors.allow-origin: "*" -
ES 地址写错、防火墙未放通 9200
-
Node.js 环境未装好、npm 依赖缺失
(二)Logstash 不采集 / 不写入 ES
1. Logstash 启动失败
-
日志:
tail -f /var/log/logstash/logstash-plain.log -
原因:
- 配置文件语法错误(用
-t测试) - JDK 版本不匹配
- 权限不足无法读日志文件
- 配置文件语法错误(用
2. 能启动但不采集日志
- 文件权限:
chmod o+r /var/log/xxx.log start_position => "beginning"是否配置- 文件是否真的有新增内容(Logstash 记录偏移量)
- 配置文件路径错误、后缀不是
.conf - 多配置文件冲突
3. 采集正常但不写入 ES
- ES 地址 / 端口错误
- ES 集群健康 red
- 索引名称格式错误
- 网络不通:
telnet ES_IP 9200 - 输出配置写错:
hosts => ["http://ip:9200"]
4. Logstash 测试命令(必背)
bash
# 测试配置语法
logstash -f xxx.conf -t
# 控制台输入输出测试
logstash -e 'input { stdin{} } output { stdout{} }'
# 输出 JSON 格式
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
(三)Kibana 打不开 / 看不到日志
1. Kibana 无法访问(5601)
- 服务未启动:
systemctl status kibana server.host: 0.0.0.0未配置- 防火墙未放通 5601
- 连接 ES 失败:查看
kibana.yml的elasticsearch.url
2. Kibana 启动但页面空白 / 报错
- ES 未启动或集群异常
- Kibana 与 ES 版本不兼容(必须大版本一致)
- 浏览器缓存问题
3. Discover 里看不到数据
- 索引未创建(去 head 插件查看)
- 时间范围不对(默认只显示最近 15 分钟)
- Index Pattern 名称不匹配(如
apache-*对应apache_2025.05.13) - 未选择
@timestamp时间字段 - Logstash 未真正写入数据
(四)日志采集类通用问题
1. 文件日志不采集
- Logstash 无读权限:最常见!
- 日志文件被切割 / 改名(Logstash 找不到 inode)
path路径写错、无通配符/*sincedb记录偏移量,需删除重采
2. 日志乱码 / 字段解析失败
- 编码不是 UTF-8
- Grok 正则表达式不匹配日志格式
- 时间字段
date插件配置错误
(五)端口速查(防火墙必开)
- Elasticsearch:9200(HTTP)9300(集群)
- Logstash:9600(API)
- Kibana:5601
- head 插件:9100
- FileBeat:无监听端口(出站 9200/5044)
(六)ELK 万能排查命令
bash
# 1. 查看 ES 集群健康
curl http://192.168.108.41:9200/_cluster/health?pretty
# 2. 查看 ES 索引列表
curl http://192.168.108.41:9200/_cat/indices?v
# 3. 检查 ES 端口
netstat -ntlp | grep java
# 4. 测试 Logstash 配置
logstash -f /etc/logstash/conf.d/xxx.conf -t
# 5. 查看 Logstash 日志
tail -f /var/log/logstash/logstash-plain.log
# 6. 检查 Kibana 状态
systemctl status kibana
# 7. 测试 ES 连通性
telnet 192.168.108.41 9200
万能排查口诀
ES 起不来 → 看日志、查权限、对配置、验端口
集群红黄 → 查节点、看分片、关防火墙
Logstash 不采 → 先加读权限、再验配置、测输出
Kibana 无数据 → 核对索引、扩时间范围、查 ES 索引
全线不通 → 先关防火墙和 SELinux,再查 hosts
十、总结
ELK 是企业运维必备、开发刚需、安全必用的日志平台,能彻底解决:
- 日志散落在多台服务器难以查询
- 日志量大 grep 卡死
- 无法可视化、无法统计
- 故障定位慢、排错效率低