ELK 企业日志分析系统总结

ELK 企业日志分析系统总结

一、ELK 核心概述

1. 核心定位

ELK 是开源实时日志分析平台,由 Elasticsearch、Logstash、Kibana 三大组件组成,解决分布式环境下日志分散存储、检索低效、分析困难等问题,提供 "收集 - 处理 - 存储 - 可视化" 端到端解决方案,广泛应用于日志分析、APM(应用性能监控)、SIEM(安全信息与事件管理)等场景。

2. 核心组件功能(银行系统类比)

组件 核心角色 核心功能 关键特性
Elasticsearch 大脑 / 心脏(金库) 海量数据存储、索引、检索、分析 分布式高可用、毫秒级近实时搜索、倒排索引、RESTful API、聚合分析
Logstash 搬运工 / 预处理车间(柜台 + 运钞车) 数据收集、过滤、转换、输送 Input/Filter/Output 三段式流程、丰富插件、支持多源输入 / 多目标输出
Kibana 窗口 / 仪表盘(监控大屏) 数据可视化、探索、交互管理 多类型图表(柱状图 / 折线图等)、仪表盘定制、索引管理、Lucene/KQL 查询支持

3. 核心工作流程

  1. 日志集中化收集(Beats 轻量收集或 Logstash 直接收集)

  2. 日志格式化处理(Logstash Filter 解析结构化数据)

  3. 索引与存储(Elasticsearch 分布式存储 + 倒排索引)

  4. 可视化展示(Kibana 图表 / 仪表盘呈现)

    数据流:日志 / 数据源 → Logstash → Elasticsearch → Kibana → Browser

二、关键技术细节

1. Elasticsearch 核心能力

  • 分布式存储:支持 PB 级数据,副本机制保障硬件故障时数据不丢失、服务不中断
  • 搜索能力:全文搜索(模糊匹配、同义词处理、相关性评分),解决拼写错误、语义关联查询需求
  • 索引技术:采用倒排索引(类似书籍索引页),查询速度远超传统逐行扫描
  • 聚合分析:支持类似 SQL GROUP BY 的分组统计、95 百分位延迟计算、用户地理分布分析等
  • 关键端口:9200(HTTP API 访问)、9300(集群节点间通信)

2. Logstash 核心流程

  • Input:支持文件(*.log)、Syslog、Kafka、MySQL、TCP/UDP、HTTP 等多源实时收集
  • Filter:核心处理环节,常用操作包括:
    • Grok:通过正则模式解析复杂文本日志(如从 Apache 访问日志中提取 IP、时间、请求方法等字段)
    • Mutate:重命名、删除、替换字段或转换数据类型
    • Date:解析时间戳并设置为标准 @timestamp 字段
    • GeoIP:根据 IP 地址补充国家、城市、经纬度信息
  • Output:默认输出至 Elasticsearch,也支持 MongoDB、Kafka、文件、邮件等目标
  • 轻量替代方案:Beats(Filebeat/Metricbeat),资源消耗更低,可直接发送数据到 ES 或 Logstash

3. Kibana 核心功能

  • 数据探索(Discover):交互式查询原始数据,支持添加过滤器缩小范围
  • 可视化(Visualize):生成柱状图、折线图、饼图、指标看板、坐标地图等
  • 仪表盘(Dashboard):组合多个可视化组件,构建实时监控大屏
  • 管理功能:索引生命周期管理(ILM)、用户权限控制、可视化模板导入导出

三、完整实施过程(CentOS7.9 环境,集群部署)

1. 实验环境准备

主机名 IP 地址 操作系统 部署软件 核心作用
node1 192.168.108.41 CentOS7.9 Elasticsearch、Kibana、elasticsearch-head ES 集群主节点、Kibana 可视化服务、集群管理工具
node2 192.168.108.42 CentOS7.9 Elasticsearch、elasticsearch-head ES 集群从节点、集群管理工具
apache 192.168.108.43 CentOS7.9 Logstash、Apache 产生 Apache 访问 / 错误日志、日志收集与格式化处理

2. 分步实施过程(重点步骤 + 命令)

(1)基础环境配置(所有节点)
  1. 配置域名解析:

    bash 复制代码
    # 编辑/etc/hosts文件,添加节点映射
    vim /etc/hosts
    192.168.108.41 node1
    192.168.108.42 node2
  2. 验证 Java 环境(要求 1.8+):

    bash 复制代码
    java -version  # 需显示openjdk version "1.8.0_262"及以上
(2)Elasticsearch 集群部署(node1+node2)
  1. 安装 ES 软件:

    bash 复制代码
    # 上传elasticsearch-5.5.0.rpm到/opt目录
    cd /opt
    rpm -ivh elasticsearch-5.5.0.rpm
  2. 配置系统服务:

    bash 复制代码
    systemctl daemon-reload
    systemctl enable elasticsearch.service  # 开机自启
  3. 修改核心配置文件(elasticsearch.yml):

    bash 复制代码
    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/  # 日志存储路径
    bootstrap.memory_lock: false  # 不锁定物理内存(避免IOPS过高)
    network.host: 0.0.0.0  # 允许所有地址访问
    http.port: 9200  # 监听端口
    discovery.zen.ping.unicast.hosts: ["node1", "node2"]  # 单播发现集群节点
  4. 创建数据目录并授权:

    bash 复制代码
    mkdir -p /data/elk_data
    chown elasticsearch:elasticsearch /data/elk_data/
  5. 启动并验证:

    bash 复制代码
    systemctl start elasticsearch.service
    netstat -antp | grep 9200  # 检查9200端口是否监听
    # 浏览器访问http://192.168.108.41:9200,显示节点信息则成功
    # 检查集群健康状态(green为正常)
    curl http://192.168.108.41:9200/_cluster/health?pretty
(3)elasticsearch-head 插件安装(node1+node2,集群可视化)
  1. 安装依赖环境:

    bash 复制代码
    yum install gcc gcc-c++ make -y  # 安装编译工具
    # 上传node-v8.2.1.tar.gz到/opt,编译安装Node.js
    cd /opt
    tar xzvf node-v8.2.1.tar.gz
    cd node-v8.2.1/
    ./configure && make -j4 && make install  # 编译耗时约20分钟
    # 上传phantomjs-2.1.1-linux-x86_64.tar.bz2到/usr/local/src
    cd /usr/local/src/
    tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
    cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
  2. 安装 head 插件:

    bash 复制代码
    # 上传elasticsearch-head.tar.gz到/usr/local/src
    cd /usr/local/src/
    tar xzvf elasticsearch-head.tar.gz
    cd elasticsearch-head/
    npm install  # 安装插件依赖
  3. 配置 ES 跨域访问(支持 head 连接):

    bash 复制代码
    vim /etc/elasticsearch/elasticsearch.yml  # 末尾添加
    http.cors.enabled: true  # 开启跨域
    http.cors.allow-origin: "*"  # 允许所有域名访问
    systemctl restart elasticsearch.service  # 重启ES
  4. 启动 head 插件并验证:

    bash 复制代码
    cd /usr/local/src/elasticsearch-head/
    npm run start &  # 后台运行
    netstat -lnupt | grep 9100  # 检查9100端口
    # 浏览器访问http://192.168.108.41:9100,输入ES地址http://192.168.108.41:9200,显示集群健康值green则成功
(4)Logstash 部署与配置(apache 节点)
  1. 安装依赖与基础服务:

    bash 复制代码
    # 安装Apache(产生日志)
    yum -y install httpd
    systemctl start httpd && systemctl enable httpd
    # 验证Java环境(同前)
    java -version
  2. 安装 Logstash:

    bash 复制代码
    # 上传logstash-5.5.1.rpm到/opt
    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/  # 建立软连接
  3. Logstash 功能测试:

    • 标准输入输出测试(验证服务可用性):

      bash 复制代码
      logstash -e 'input { stdin{} } output { stdout{} }'
      # 输入www.baidu.com,输出带时间戳的日志则正常
    • 详细输出测试(rubydebug 格式):

      bash 复制代码
      logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
      # 输入内容后显示结构化字段(@timestamp、host、message)
    • 对接 ES 测试(数据写入 ES):

      bash 复制代码
      logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
      # 输入多条内容后,在head插件中查看是否生成logstash-日期索引
  4. 配置日志收集(系统日志 + Apache 日志):

    • 系统日志配置(/etc/logstash/conf.d/system.conf):

      bash 复制代码
      chmod o+r /var/log/messages  # 授权Logstash读取系统日志
      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 日志配置(/etc/logstash/conf.d/apache_log.conf):

      bash 复制代码
      vim /etc/logstash/conf.d/apache_log.conf
      input {
        file{
          path => "/etc/httpd/logs/access_log"  # Apache访问日志
          type => "access"
          start_position => "beginning"
        }
        file{
          path => "/etc/httpd/logs/error_log"  # Apache错误日志
          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}"
          }
        }
      }
  5. 重启 Logstash 生效:

    bash 复制代码
    systemctl restart logstash.service
(5)Kibana 部署与可视化(node1 节点)
  1. 安装 Kibana:

    bash 复制代码
    # 上传kibana-5.5.1-x86_64.rpm到/usr/local/src
    cd /usr/local/src/
    rpm -ivh kibana-5.5.1-x86_64.rpm
  2. 修改配置文件(kibana.yml):

    bash 复制代码
    cd /etc/kibana/
    cp kibana.yml kibana.yml.bak  # 备份
    vim kibana.yml
    server.port: 5601  # Kibana访问端口
    server.host: "0.0.0.0"  # 允许所有地址访问
    elasticsearch.url: "http://192.168.108.41:9200"  # 关联ES集群
    kibana.index: ".kibana"  # 在ES中创建的索引名
  3. 启动并验证:

    bash 复制代码
    systemctl start kibana.service && systemctl enable kibana.service
    # 浏览器访问http://192.168.108.41:5601,进入Kibana界面则成功
  4. 日志可视化配置:

    • 创建索引模式:Management → Index Patterns → Create index pattern
      • 系统日志:输入 system-*,选择时间字段 @timestamp,点击 Create
      • Apache 访问日志:输入 apache_access-*,同上
      • Apache 错误日志:输入 apache_error-*,同上
    • 查看日志:点击 Discover,选择对应索引模式,即可查看结构化日志(时间、主机、日志内容等)
    • 构建仪表盘:Visualize 创建图表 → Dashboard 组合多个图表,实现实时监控

3. 关键验证结果

  • ES 集群:2 个节点正常加入,集群状态 green,索引自动分片(默认 5 个分片 + 1 个副本)
  • Logstash:成功收集系统日志、Apache 访问 / 错误日志,ES 中生成对应日期索引
  • Kibana:可通过索引模式筛选日志,生成直观图表,支持按字段过滤、排序

四、核心优势与实施注意事项

1. 核心优势

  • 集中化:解决多服务器日志分散问题,无需逐台登录查看
  • 高效性:毫秒级检索、分布式存储,支持海量数据处理
  • 易用性:可视化界面降低分析门槛,无需复杂 Linux 命令
  • 扩展性:支持集群横向扩展,适应业务增长

2. 注意事项

  • Elasticsearch:避免频繁更新数据(非事务型数据库),合理规划索引生命周期
  • Logstash:资源消耗较高,轻量场景用 Beats 替代 Input;Filter 配置需优化正则效率
  • 集群部署:确保节点间网络连通,集群名称一致,跨域配置仅用于测试环境(生产需限制域名)
  • 权限控制:生产环境需配置 ES/Kibana 用户认证,避免未授权访问
  • 存储规划:根据日志量预留足够磁盘空间,定期清理过期索引
相关推荐
-dcr1 天前
47.ELK企业日志分析系统
elk
Elastic 中国社区官方博客1 天前
Elasticsearch:圣诞晚餐 BBQ
大数据·人工智能·elk·elasticsearch·搜索引擎·ai·全文检索
深圳_吴彦祖2 天前
elk部署8.12单机版
elk
2301_800050992 天前
Zabbix和ELK
笔记·elk·zabbix
这就是佬们吗2 天前
一文讲清---ELK搭建
java·笔记·elk·docker·容器
别多香了2 天前
ELK 企业日志分析系统详细介绍与总结
elk
小波小波轩然大波2 天前
ELK 与 Zabbix
elk·zabbix
神秘面具男033 天前
ELK 企业日志分析系统部署与使用指南
elk
2301_767902643 天前
ELK企业日志分析系统
elk