企业级 ELK 日志分析系统

企业级 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 工作流程

  1. 产生日志:Apache、Nginx、系统日志、应用业务日志
  2. 采集日志:FileBeat/Logstash Agent 收集
  3. 清洗格式化:Logstash 过滤、解析、切字段
  4. 入库存储:写入 Elasticsearch 建立索引
  5. 查询展示: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. 集群检查


五、安装 elasticsearch-head 可视化管理工具

作用:网页查看 ES 集群状态、索引、分片、数据

依赖:Node.js + PhantomJS

安装完成后访问:

http://192.168.108.41:9100

输入 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

访问:http://192.168.108.41:5601

4. Kibana 使用步骤

  1. 配置 Index Pattern(如 system-、apache_access-、apache_error-*)
  2. 选择时间字段 @timestamp
  3. 进入 Discover 查看日志
  4. 创建可视化图表 → 组合成 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

  • 常见原因:

    1. JDK 版本不对(必须 JDK8,高版本 ES 需 JDK11+)
    2. 内存不足:/etc/elasticsearch/jvm.options 堆内存过大
    3. 数据目录权限不对:必须 elasticsearch:elasticsearch
    4. 端口 9200/9300 被占用
    5. cluster.namenode.name 配置错误
    6. discovery.zen.ping.unicast.hosts 集群地址写错

2. 集群状态 yellow /red(不是 green)

  • green:正常

  • yellow:副本未分配(节点不足)

  • red:主分片未分配(数据丢失 / 节点挂了)

  • 排查:

    1. 检查所有节点是否在线
    2. 检查防火墙 /hosts 解析
    3. 检查分片数 > 节点数导致副本无法分配
    4. 接口查看:http://ip:9200/_cluster/health?pretty

3. head 插件连不上 ES

  • ES 未开启跨域:

    bash 复制代码
    http.cors.enabled: true
    http.cors.allow-origin: "*"
  • ES 地址写错、防火墙未放通 9200

  • Node.js 环境未装好、npm 依赖缺失


(二)Logstash 不采集 / 不写入 ES

1. Logstash 启动失败

  • 日志:tail -f /var/log/logstash/logstash-plain.log

  • 原因:

    1. 配置文件语法错误(用 -t 测试)
    2. JDK 版本不匹配
    3. 权限不足无法读日志文件

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.ymlelasticsearch.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 卡死
  • 无法可视化、无法统计
  • 故障定位慢、排错效率低
相关推荐
卧室小白4 天前
ELK+Kafka实战
分布式·elk·kafka
heimeiyingwang6 天前
【架构实战】设计一个日志分析平台(ELK架构)
elk·架构·linq
AI木马人15 天前
16.【ELK日志系统实战】一次线上“定位失败”让我重构日志体系:如何在3分钟内定位AI系统问题?(完整可复现方案)
elk·重构
炸炸鱼.16 天前
ELK 企业级日志分析系统完整部署手册
elk·wpf
m0_7375393720 天前
ELK企业日志分析系统
elk
LSL666_20 天前
快速Spring Cloud+ELK+AOP搭建一个简单的项目
spring·elk·spring cloud
JackSparrow41422 天前
使用Elasticsearch代替数据库like以加快查询的各种技术方案+实现细节
大数据·clickhouse·elk·elasticsearch·搜索引擎·postgresql·全文检索
工作log23 天前
从零搭建 ELK + Kafka 日志收集系统(Spring Boot + Logback 直连 Kafka)
spring boot·elk·kafka
總鑽風1 个月前
搭建Spring Boot + ELK日志平台,实现可视化日志监控
spring boot·elk·macos