ELK 企业日志分析系统详细介绍与总结

ELK 企业日志分析系统详细介绍与总结

一、文档概述

本文档全面讲解了 ELK 企业日志分析系统,包括其核心组件、工作原理、部署配置流程及实际应用案例。ELK 由 Elasticsearch、Logstash 和 Kibana 三个开源工具组成,旨在解决分布式环境下日志分散存储、检索低效等问题,提供日志集中收集、格式化处理、索引存储、可视化分析的端到端解决方案,广泛应用于日志分析、应用性能监控、安全信息与事件管理等领域。

二、核心组件介绍

(一)Elasticsearch:分布式搜索和分析引擎

  • 核心角色:系统的 "大脑和心脏",负责海量数据的存储、检索和分析。

  • 关键特性

    1. 分布式存储与高可用:支持 PB 级数据存储,通过副本机制避免数据丢失和服务中断。
    2. 近乎实时搜索:数据写入后毫秒级可检索,适配实时监控场景。
    3. 强大全文搜索:基于 Apache Lucene,支持模糊搜索、同义词处理、相关性评分。
    4. 倒排索引技术:查询速度远超传统逐行扫描数据库。
    5. 丰富 RESTful API:便于与其他系统集成。
    6. 聚合分析能力:支持类似 SQL GROUP BY 的复杂统计分析(如按应用分组统计错误日志、计算访问延迟百分位等)。

(二)Logstash:服务器端数据处理管道

  • 核心角色:数据的 "搬运工和预处理车间",负责收集、解析、转换和输送数据。

  • 工作流程

    :Input(输入)→ Filter(过滤)→ Output(输出)

    1. Input:支持文件、系统日志、消息队列、数据库、网络协议等多种数据源。
    2. Filter:核心功能,将非结构化日志解析为结构化数据,常用插件包括 Grok(正则解析)、Mutate(字段修改)、Date(时间戳解析)、GeoIP(IP 地址解析)、KV(key=value 解析)。
    3. Output:将处理后的数据输出至 Elasticsearch、数据库、消息队列等目的地。
  • 补充说明:轻量级场景下可使用 Beats(如 Filebeat)替代其 Input 功能,降低资源消耗。

(三)Kibana:数据可视化与管理平台

  • 核心角色:系统的 "窗口和仪表盘",提供数据探索、可视化和交互功能。

  • 主要功能

    1. 数据探索(Discover):支持 Lucene/KQL 查询语法,可动态过滤数据并查看详细文档。
    2. 可视化(Visualize):提供柱状图、折线图、饼图、指标看板、地图等多种图表组件。
    3. 仪表盘(Dashboard):可组合多个可视化组件,实现系统状态、性能指标的全局监控。
    4. 系统管理:支持索引生命周期管理、用户权限控制、可视化配置导入 / 导出等。

三、部署环境与拓扑

(一)环境说明

主机名 IP 地址 操作系统 主要安装软件 服务端口
node1 192.168.108.41 CentOS7.9 Elasticsearch、Kibana 9200(ES)、5601(Kibana)
node2 192.168.108.42 CentOS7.9 Elasticsearch 9200(ES)
apache 192.168.108.43 CentOS7.9 Logstash、Apache(httpd) 9600(Logstash)

(二)拓扑流程

【APPServer 集群(Apache)】→【Logstash Agent 采集器】→【Elasticsearch Cluster(node1+node2)】→【Kibana Server】→【Browser】

四、详细部署步骤(含代码示例)

(一)前置准备:配置 Java 环境与域名解析

所有节点需安装 Java 1.8 + 环境,以 node1 为例:

bash 复制代码
# 查看Java版本(需确保输出openjdk version "1.8.0_262"及以上)
[root@node1 ~]# 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)

# 配置域名解析(node1和node2均需执行)
[root@node1 ~]# vi /etc/hosts
# 添加以下两行
192.168.108.41 node1
192.168.108.42 node2

(二)部署 Elasticsearch 集群(node1+node2)

1. 安装 Elasticsearch(以 node1 为例,node2 步骤一致)
bash 复制代码
# 上传安装包至/opt目录,执行安装
[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm

# 加载系统服务并设置开机自启
[root@node1 opt]# systemctl daemon-reload
[root@node1 opt]# systemctl enable elasticsearch.service

# 备份并修改主配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
# 关键配置(修改或添加以下内容)
cluster.name: my-elk-cluster  # 集群名称(node1和node2需一致)
node.name: node1  # 节点名称(node2需改为node2)
path.data: /data/elk_data  # 数据存放路径
path.logs: /var/log/elasticsearch/  # 日志存放路径
bootstrap.memory_lock: false  # 不锁定物理内存
network.host: 0.0.0.0  # 绑定所有IP地址
http.port: 9200  # 监听端口
discovery.zen.ping.unicast.hosts: ["node1", "node2"]  # 集群单播发现

# 创建数据目录并授权
[root@node1 opt]# mkdir -p /data/elk_data
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/

# 启动服务并验证
[root@node1 opt]# systemctl start elasticsearch.service
[root@node1 opt]# netstat -antp | grep 9200  # 查看9200端口是否监听
tcp6       0      0 :::9200                 :::*                    LISTEN      64463/java

# 浏览器访问验证(返回节点信息即成功)
http://192.168.108.41:9200
2. 集群健康状态检查
bash 复制代码
# 浏览器访问集群健康接口(status为green表示正常)
http://192.168.108.41:9200/_cluster/health?pretty
# 返回结果示例
{
  "cluster_name" : "my-elk-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

(三)安装 elasticsearch-head 插件(集群管理工具)

1. 安装依赖环境(node1 和 node2 均需执行)
bash 复制代码
# 安装编译依赖
[root@node1 ~]# yum install gcc gcc-c++ make -y

# 安装Node.js(elasticsearch-head运行基础)
[root@node1 ~]# cd /opt
[root@node1 opt]# tar xzvf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j4  # 编译耗时较长(约20分钟)
[root@node1 node-v8.2.1]# make install

# 安装PhantomJS(前端渲染依赖)
[root@node1 node-v8.2.1]# cd /usr/local/src/
[root@node1 src]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin
2. 安装并启动 elasticsearch-head
bash 复制代码
# 解压并安装插件
[root@node1 bin]# cd /usr/local/src/
[root@node1 src]# tar xzvf elasticsearch-head.tar.gz
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install  # 安装依赖包

# 修改Elasticsearch配置以支持跨域访问
[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
# 末尾添加以下配置
http.cors.enabled: true
http.cors.allow-origin: "*"

# 重启Elasticsearch
[root@node1 elasticsearch-head]# systemctl restart elasticsearch

# 启动elasticsearch-head(后台运行)
[root@node1 elasticsearch-head]# npm run start &
# 输出示例
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

# 验证端口监听
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      114739/grunt
3. 验证插件连接

浏览器访问 http://192.168.108.41:9100,在输入框中填写 http://192.168.108.41:9200 并点击 "连接",显示集群健康值为 green 即成功。

(四)部署 Logstash(apache 节点)

1. 前置准备
bash 复制代码
# 关闭防火墙和SELinux
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# setenforce 0

# 安装Apache服务(生成日志源)
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
[root@apache ~]# systemctl enable httpd

# 验证Java环境
[root@apache ~]# 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)
2. 安装并配置 Logstash
bash 复制代码
# 安装Logstash
[root@apache ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/  # 建立软连接

# 测试Logstash基本功能(标准输入→标准输出)
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
# 输入测试内容,输出示例
www.baidu.com
2025-12-12T07:05:01.001Z apache www.baidu.com
www.sina.com.cn
2025-12-12T07:05:08.375Z apache www.sina.com.cn
# 按Ctrl+C退出

# 测试结构化输出(rubydebug格式)
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
# 输入www.baidu.com,输出示例
{
    "@timestamp" => 2025-12-12T07:08:43.174Z,
      "@version" => "1",
          "host" => "apache",
       "message" => "www.baidu.com"
}

# 测试对接Elasticsearch(输入数据写入ES)
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.108.41:9200"] } }'
# 输入测试数据
www.baidu.com
www.360.cn
www.qq.com
# 浏览器访问elasticsearch-head,可看到生成logstash-2025.12.12索引
3. 配置 Logstash 收集系统日志和 Apache 日志
bash 复制代码
# 配置收集系统日志(/var/log/messages)
[root@apache ~]# chmod o+r /var/log/messages  # 赋予读权限
[root@apache ~]# 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日志(访问日志和错误日志)
[root@apache ~]# vim /etc/logstash/conf.d/apache_log.conf
# 配置内容
input {
  file{
    path => "/etc/httpd/logs/access_log"
    type => "access"
    start_position => "beginning"
  }
  file{
    path => "/etc/httpd/logs/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}"
    }
  }
}

# 重启Logstash使配置生效
[root@apache ~]# systemctl restart logstash.service

(五)部署 Kibana(node1 节点)

bash 复制代码
# 安装Kibana
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm

# 备份并修改配置文件
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
# 关键配置
server.port: 5601  # 监听端口
server.host: "0.0.0.0"  # 绑定所有IP
elasticsearch.url: "http://192.168.108.41:9200"  # 连接ES集群
kibana.index: ".kibana"  # Kibana自身索引

# 启动Kibana并设置开机自启
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
配置 Kibana 索引模式(可视化日志)
  1. 浏览器访问

    复制代码
    http://192.168.108.41:5601

    ,首次登录创建索引模式:

    • 输入 system-*,选择时间字段 @timestamp,点击 "Create" 创建系统日志索引。
    • 同理创建 apache_access-*apache_error-* 索引模式。
  2. 点击左侧 "Discover",选择对应索引模式,即可查看结构化的日志数据,支持过滤、搜索等操作。

五、总结

(一)核心优势

  1. 集中化管理:解决分布式环境下日志分散问题,无需逐台登录服务器查看日志。
  2. 高效检索:Elasticsearch 的倒排索引技术实现毫秒级日志检索,支持复杂查询条件。
  3. 可视化分析:Kibana 提供直观的图表和仪表盘,降低数据分析门槛。
  4. 高可用性:Elasticsearch 集群部署 + 副本机制,确保服务稳定和数据安全。

(二)关键部署要点

  1. 环境依赖:所有组件均需 Java 1.8 + 环境,elasticsearch-head 依赖 Node.js 和 PhantomJS。
  2. 配置一致性:Elasticsearch 集群节点需保持集群名称、发现机制配置一致。
  3. 权限与路径:数据目录需赋予对应服务用户权限,避免启动失败。
  4. 索引管理:通过 Logstash 配置按日期生成索引,便于日志归档和清理。
相关推荐
小波小波轩然大波2 小时前
ELK 与 Zabbix
elk·zabbix
神秘面具男031 天前
ELK 企业日志分析系统部署与使用指南
elk
2301_767902641 天前
ELK企业日志分析系统
elk
小马爱打代码1 天前
架构设计:搭建 ELK 日志系统
elk
你什么冠军?2 天前
ELK日志
elk
云和数据.ChenGuang2 天前
elk日志运维工程师技术之故障处理
运维·数据库·elk·jenkins·运维工程师
管理大亨4 天前
电商零售ELK应用:五大核心场景解析
大数据·elk·零售
管理大亨4 天前
光伏大棚智慧管理:ELK数据中枢
大数据·运维·elk·elasticsearch
flying robot5 天前
ELK单节点集群配置
运维·elk·jenkins