ELK 企业日志分析系统

一、ELK 基础概述

1.1 日志分析背景

日志分为三类:系统日志、应用日志、安全日志

传统日志痛点:

  1. 日志分散在多台服务器,逐台登录查看效率极低;
  2. 使用 grep/awk/wc 做检索统计,海量数据下性能不足;
  3. 无统一可视化界面,故障排查、指标统计不直观。

解决方案: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 核心能力
  1. 分布式高可用:数据分片 + 副本机制,单节点故障不丢数据、服务不中断,支持 PB 级数据;
  2. 近实时检索:数据写入后 1 秒内可查询,适配实时告警监控;
  3. 强大全文检索:基于 Lucene,支持模糊搜索、同义词、相关性打分;
  4. 倒排索引:类比书籍目录,查询速度远高于传统数据库逐行扫描;
  5. RESTful API:所有增删改查、集群管理均可 HTTP 调用,易集成;
  6. 聚合分析:等价 SQL GROUP BY,统计访问量、错误数、延迟分位数、地理分布等。

短板:不适合高频事务更新场景(MySQL 优势),擅长海量日志过滤、检索、统计。

(2)Logstash 三阶段流水线 Input→Filter→Output
  1. Input(采集)

    支持文件、syslog、Kafka/Redis 消息队列、MySQL、TCP/UDP、Beats 等多数据源。

  2. Filter(清洗,核心)

    • Grok:正则解析非结构化日志,拆分 IP、时间、请求码、接口等字段;
    • Mutate:字段重命名、删除、类型转换;
    • Date:统一日志时间戳为@timestamp
    • GeoIP:IP 解析归属地、经纬度;
    • KV:解析key=value格式日志。
  3. Output(输出)

    主流输出 ES,也支持 MongoDB、Kafka、本地文件、邮件、监控告警系统。

特点:功能全面,但资源开销大;轻量采集优先 Filebeat。

(3)Kibana 可视化平台
  1. Discover:交互式日志检索,支持 KQL/Lucene 语法筛选原始日志;
  2. Visualize:生成折线图、柱状图、饼图、地图、热力图、指标卡片;
  3. Dashboard:多图表组合大屏,实时监控系统健康、业务指标;
  4. 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 实验目标

  1. 搭建双节点 Elasticsearch 集群;
  2. 部署 head 可视化插件管理 ES 集群;
  3. Logstash 采集 Apache 访问 / 错误日志、系统日志;
  4. 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 操作一致)

  1. 上传 elasticsearch-5.5.0.rpm/opt,安装
cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
# 加载系统服务、开机自启
systemctl daemon-reload
systemctl enable elasticsearch.service
  1. 备份主配置文件并修改
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: "*"
  1. 创建数据目录并授权(ES 进程运行用户为 elasticsearch)
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/
  1. 启动 ES 并验证端口
systemctl start elasticsearch.service
netstat -antp | grep 9200
  1. 单节点访问验证(浏览器打开)

    http://192.168.108.41:9200
    

    /

    http://192.168.108.42:9200
    

    返回 JSON 包含节点名、集群名即启动成功。

3.3 ES 集群状态校验

  1. 集群健康状态(green 代表正常)

    http://192.168.108.41:9200/_cluster/health?pretty
    

    关键字段:

  • status: green 集群健康
  • number_of_nodes: 2 识别 2 个节点
  1. 集群完整状态信息

    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 前置操作

  1. 关闭防火墙、selinux;
  2. 安装 Apache httpd 服务
yum -y install httpd
systemctl start httpd
# Apache日志路径
/var/log/httpd/access_log  # 访问日志
/var/log/httpd/error_log   # 错误日志
  1. 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 基础测试命令

  1. 标准输入→标准输出(最简管道测试)
logstash -e 'input { stdin{} } output { stdout{} }'
# 输入文字会自动输出带时间、主机字段日志
  1. rubydebug 格式化输出,查看完整结构化字段
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
  1. 标准输入直接写入 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-xxxapache_error-xxx索引。

五、Kibana 可视化部署(node1 192.168.108.41)

5.1 Kibana 安装配置

  1. 上传 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
  1. 核心配置项
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.108.41:9200"
kibana.index: ".kibana" # Kibana自身配置存储索引
  1. 启动服务
systemctl start kibana.service
systemctl enable kibana.service
  1. 访问地址:http://192.168.108.41:5601

5.2 Kibana 索引模式创建(核心操作)

索引模式用于匹配 ES 中同类日志索引,以*通配日期后缀:

  1. 左侧菜单 ManagementIndex PatternsCreate index pattern
  2. 分别创建三类索引:
    • system-*:系统日志
    • apache_access-*:Apache 访问日志
    • apache_error-*:Apache 错误日志
  3. Time Filter field name 选择 @timestamp(日志标准时间字段),点击 Create 完成。

5.3 日志检索与可视化

  1. Discover:切换对应索引模式,按时间筛选、搜索关键字查看原始日志;
  2. Visualize:基于索引创建折线图、饼图、访问量指标、错误统计;
  3. Dashboard:将多个图表整合为监控大屏,实时观测日志状态。

六、整体实验流程总结

  1. 环境初始化:配置 hosts、JDK1.8;
  2. 双节点 ES 集群部署,开启跨域,安装 head 插件管理集群;
  3. Apache 节点部署 Logstash,编写多套采集配置(系统日志、Apache 日志);
  4. node1 部署 Kibana,对接 ES 集群,创建索引模式;
  5. 生成业务日志,在 Kibana 检索、可视化分析日志。

七、常见知识点总结

  1. ES 是分布式存储检索引擎,靠倒排索引实现高速查询;
  2. Logstash 三阶段:Input 采集、Filter 清洗、Output 输出,生产多用 Filebeat 轻量化采集;
  3. head 插件仅用于 ES 集群简易管理,生产环境优先 Kibana;
  4. Kibana 通过索引模式匹配 ES 按日期滚动的日志索引;
  5. ES 集群双节点为对等节点,无严格主从,副本机制保障数据安全;
  6. Logstash 支持条件输出,可按日志类型拆分不同索引,方便 Kibana 分类查看。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐