ELK 企业级日志分析系统实战教程

前言

相关知识简介

[1. ELK 概述](#1. ELK 概述)

[2. Elasticsearch 核心知识](#2. Elasticsearch 核心知识)

[3. Logstash 核心知识](#3. Logstash 核心知识)

[4. Kibana 核心知识](#4. Kibana 核心知识)

[5. 为什么要用 ELK](#5. 为什么要用 ELK)

[6. 完整日志系统特征](#6. 完整日志系统特征)

[7. ELK 工作原理](#7. ELK 工作原理)

实验环境规划(本次实验未使用node2,配置仅供参考)

基础环境准备

系统配置

Elasticsearch集群部署

安装Elasticsearch

配置Elasticsearch

启动并验证

安装Elasticsearch-head管理界面

安装依赖环境

安装并启动Elasticsearch-head

Logstash部署与配置

安装Logstash

测试Logstash功能

配置系统日志收集

Kibana数据可视化

安装Kibana

配置Kibana

启动并访问

Apache日志收集实战

安装Apache服务

配置Logstash收集Apache日志

Filebeat轻量级日志收集

安装Filebeat

配置Filebeat

配置Logstash接收Filebeat数据

小结

[附录:本次 ELK 部署与调试中遇到的问题总结](#附录:本次 ELK 部署与调试中遇到的问题总结)

[1. Logstash 配置语法错误](#1. Logstash 配置语法错误)

[2. JAVA_HOME 未设置](#2. JAVA_HOME 未设置)

[3. Filebeat 连接 Logstash 报 "connection refused"](#3. Filebeat 连接 Logstash 报 “connection refused”)

[4. Logstash Beats 插件报 "地址已在使用"](#4. Logstash Beats 插件报 “地址已在使用”)

[5.Elasticsearch 报错问题:Java 环境找不到](#5.Elasticsearch 报错问题:Java 环境找不到)

[6. Kibana / Elasticsearch 配置小坑](#6. Kibana / Elasticsearch 配置小坑)

前言

在分布式系统和微服务架构成为主流的今天,日志管理已成为运维工作的核心挑战。面对海量且分散的日志数据,传统的命令行工具显得力不从心。

ELK Stack(Elasticsearch、Logstash、Kibana)作为开源日志解决方案的标杆,能够实现日志的集中收集、实时分析和可视化展示,让运维人员从繁琐的日志排查中解放出来。

本文将以实战为核心,手把手带你搭建一套完整可用的ELK系统。无论你是运维工程师还是开发人员,都能通过本文掌握企业级日志平台的构建方法。

现在,让我们开始这场日志管理的技术之旅!

相关知识简介

1. ELK 概述

ELK 是 Elasticsearch、Logstash 和 Kibana 三个开源工具的组合,提供一套完整的日志集中处理与分析解决方案:

  • Elasticsearch:核心搜索和分析引擎,用于存储日志并提供全文检索、聚合分析能力。

  • Logstash:数据收集与处理管道,从多种来源采集数据、清洗、转换后输出到 Elasticsearch。

  • Kibana:可视化与交互式分析工具,基于 Elasticsearch 数据构建仪表盘、图表和报告。

ELK Stack 能帮助企业统一收集、存储和分析来自多台服务器、不同应用的日志数据,适合日志分析、实时监控、数据可视化等场景。

2. Elasticsearch 核心知识

  • 核心功能:全文检索、实时数据分析、分布式架构、RESTful API。

  • 架构组件:集群、节点、索引、文档、分片、副本。

  • 典型场景:日志和事件数据分析、全文搜索应用、监控与告警、商业智能。

  • 优缺点:性能高、可扩展、灵活;但内存消耗大、管理复杂。

3. Logstash 核心知识

Logstash 是数据收集引擎,支持动态从各种数据源收集数据并进行过滤、分析、统一格式化后输出。

  • 特点:多源数据采集、灵活过滤处理、丰富输出插件、插件可扩展、实时处理。

  • 使用场景:日志收集与分析、数据清洗与转换、数据流整合。

  • 轻量替代方案

    • Filebeat:轻量级日志收集器,安装在客户端把日志直接发到 Logstash 或 Elasticsearch。

    • Fluentd:资源占用更少,在 Kubernetes 集群中常与 Elasticsearch 组成 EFK 方案。

4. Kibana 核心知识

Kibana 是 Elasticsearch 的可视化面板。

  • 主要功能:丰富的数据可视化、交互式仪表板、日志搜索与管理、时间序列分析、报警与监控、基于角色的访问控制、地理可视化、报表生成。

  • 使用场景:集中化日志管理与分析、实时监控、业务数据分析、安全分析、机器学习与趋势预测。

  • 工作原理:Kibana 自身不存储数据,通过 REST API 从 Elasticsearch 查询数据并展示。

5. 为什么要用 ELK

传统的 grep/awk 在单机日志上还能用,但在多台服务器、大规模分布式环境下检索和统计困难、效率低。ELK 提供集中化收集、索引、可视化分析,大幅提高排障、监控和决策效率。

6. 完整日志系统特征

  • 收集:多源日志采集。

  • 传输:稳定解析和过滤并传输到存储系统。

  • 存储:集中存储日志数据。

  • 分析:友好的 UI 分析界面。

  • 告警:支持错误报告和监控。

7. ELK 工作原理

  1. 在需要收集日志的服务器上部署 Logstash(或使用 Filebeat 先收集到日志服务器)。

  2. Logstash 收集日志并格式化后写入 Elasticsearch。

  3. Elasticsearch 对数据进行索引和存储。

  4. Kibana 从 Elasticsearch 查询数据并生成图表展示。

实验环境规划(本次实验未使用node2,配置仅供参考)

节点名称 IP地址 部署服务
Node1 192.168.114.252 Elasticsearch、Kibana
Node2 192.168.10.14 Elasticsearch
Apache节点 192.168.114.251 Logstash、Apache
Filebeat节点 192.168.114.253 Filebeat

基础环境准备

系统配置

在所有节点上执行以下操作:

bash

复制代码
# 关闭防火墙和SELinux
systemctl stop firewalld
setenforce 0

# 设置主机名(分别在对应节点执行)
hostnamectl set-hostname node1    # Node1节点
hostnamectl set-hostname node2    # Node2节点
hostnamectl set-hostname apache   # Apache节点
hostnamectl set-hostname filebeat # Filebeat节点

# 配置主机解析
echo "192.168.114.252 node1" >> /etc/hosts
echo "192.168.10.14 node2" >> /etc/hosts
echo "192.168.114.251 apache" >> /etc/hosts
echo "192.168.114.253 filebeat" >> /etc/hosts

# 安装Java环境
yum -y install java
java -version

Elasticsearch集群部署

安装Elasticsearch

在Node1和Node2节点上执行:

bash

复制代码
cd /opt
rpm -ivh elasticsearch-6.6.1.rpm
systemctl daemon-reload
systemctl enable elasticsearch.service

配置Elasticsearch

编辑配置文件 /etc/elasticsearch/elasticsearch.yml

yaml

复制代码
cluster.name: my-elk-cluster  #17行,取消注释,指定集群名字
node.name: node1  # 23行,Node2节点改为node2
path.data: /data/elk_data  #33行,取消注释,指定数据存放路径
path.logs: /var/log/elasticsearch/ #37行,取消注释,指定日志存放路径
bootstrap.memory_lock: false  #43行,取消注释,改为在启动的时候不锁定内存
network.host: 0.0.0.0 #55行,取消注释,设置监听地址,0.0.0.0代表所有地址
http.port: 9200 #59行,取消注释,ES 服务的默认监听端口为9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] #68行,取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2

启动并验证

bash

复制代码
# 创建数据目录
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data
​
# 启动服务
systemctl start elasticsearch
​
# 验证服务
netstat -antp | grep 9200

访问 http://192.168.114.252:9200 查看节点信息,访问 http://192.168.114.252:9200/_cluster/health?pretty 查看集群健康状态。

安装Elasticsearch-head管理界面

安装依赖环境

在Node1节点上安装Node.js和PhantomJS:

bash

复制代码
# 安装Node.js
yum install gcc gcc-c++ make -y
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1
./configure
make && make install
​
# 安装PhantomJS
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin

安装并启动Elasticsearch-head

bash

复制代码
cd /opt
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/
npm install
​
# 配置Elasticsearch支持跨域
echo "http.cors.enabled: true" >> /etc/elasticsearch/elasticsearch.yml
echo "http.cors.allow-origin: \"*\"" >> /etc/elasticsearch/elasticsearch.yml
​
systemctl restart elasticsearch
​
# 启动head服务
cd /usr/local/src/elasticsearch-head/
npm run start &

访问 http://192.168.114.252:9100 即可管理Elasticsearch集群。

Logstash部署与配置

安装Logstash

在Apache节点上执行:

bash

复制代码
#安装apache服务
yum -y install httpd
systemctl start httpd
​
cd /opt
rpm -ivh logstash-6.6.1.rpm
systemctl start logstash
systemctl enable logstash
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

测试Logstash功能

bash

复制代码
# 测试标准输入输出
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

# 测试写入Elasticsearch
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.114.252:9200"] } }'

配置系统日志收集

创建配置文件 /etc/logstash/conf.d/system.conf

ruby

复制代码
input {
  file {
    path => "/var/log/messages"
    type => "system"
    start_position => "beginning"
  }
}
​
output {
  elasticsearch {
    hosts => ["192.168.114.252:9200"]
    index => "system-%{+YYYY.MM.dd}"
  }
}

设置日志文件权限并重启服务:

bash

复制代码
chmod +r /var/log/messages
systemctl restart logstash

Kibana数据可视化

安装Kibana

在Node1节点上执行:

bash

复制代码
cd /opt
rpm -ivh kibana-6.6.1-x86_64.rpm

配置Kibana

编辑 /etc/kibana/kibana.yml

yaml

复制代码
server.port: 5601  --2--取消注释,Kiabana 服务的默认监听端口为5601
server.host: "0.0.0.0"  --7--取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
elasticsearch.hosts: ["http://192.168.114.252:9200"]  --28--取消注释,设置和 Elasticsearch 建立连接的地址和端口
kibana.index: ".kibana"  --37--取消注释,设置在 elasticsearch 中添加.kibana索引

启动并访问

bash

复制代码
systemctl start kibana
systemctl enable kibana

访问 http://192.168.114.252:5601,创建索引模式 system-* 即可查看系统日志。

Apache日志收集实战

安装Apache服务

bash

复制代码
yum -y install httpd
systemctl start httpd

配置Logstash收集Apache日志

创建配置文件 /etc/logstash/conf.d/apache_log.conf

ruby

复制代码
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.114.252:9200"]
      index => "apache_access-%{+YYYY.MM.dd}"
    }
  }
  if [type] == "error" {
    elasticsearch {
      hosts => ["192.168.114.252:9200"]
      index => "apache_error-%{+YYYY.MM.dd}"
    }
  }
}

执行收集命令:

bash

复制代码
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache_log.conf

在Kibana中创建 apache_access-*apache_error-* 索引模式即可查看Apache日志。

Filebeat轻量级日志收集

安装Filebeat

在Filebeat节点上执行:

bash

复制代码
cd /opt
tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz
mv filebeat-6.2.4-linux-x86_64 /usr/local/filebeat
#rpm方式
rpm -ivh filebeat-6.6.1-x86_64.rpm 

配置Filebeat

编辑 /usr/local/filebeat/filebeat.yml

yaml

复制代码
filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /var/log/messages
    - /var/log/*.log
  fields:
    service_name: filebeat
    log_type: log
    service_id: 192.168.114.253
 --------------Elasticsearch output-------------------
(全部注释掉)
----------------Logstash output---------------------
output.logstash:
  hosts: ["192.168.114.251:5044"]

注:rpm 方式的路径在/etc/filebeat/filebeat.yml

配置Logstash接收Filebeat数据

在Apache节点创建 /etc/logstash/conf.d/logstash.conf

ruby

复制代码
input {
  beats {
    port => "5044"
  }
}

output {
  elasticsearch {
    hosts => ["192.168.114.252:9200"]
    index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
  }
  stdout {
    codec => rubydebug
  }
}

启动Filebeat:

bash

复制代码
cd /usr/local/filebeat
./filebeat -e -c filebeat.yml
​
#启动 logstash
logstash -f logstash.conf

在Kibana中创建 filebeat-* 索引模式查看数据。

相关实验截图

小结

通过以上步骤,我们搭建了一个完整的企业级日志分析系统:Elasticsearch 负责存储和检索,Logstash(或 Filebeat)负责收集与处理,Kibana 负责可视化展示。系统具备实时采集、集中存储、可视化分析、报警监控等特性,适合企业级生产环境。

附录:本次 ELK 部署与调试中遇到的问题总结

1. Logstash 配置语法错误

  • 表现 :启动日志中出现 Expected one of #, if, ", ', } at line...

  • 原因.conf 文件中存在全角空格、Tab、引号、或者花括号不匹配。

  • 解决

    • 用纯 ASCII 空格重新整理配置。

    • sudo /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t 检查语法。

    • 建议写入配置前先用检测工具检测一下语法空格等问题,修改后再用

2. JAVA_HOME 未设置

  • 表现could not find java; set JAVA_HOME or ensure java is in PATH,但是echo$PATH有jdk

  • 原因:RPM 包未正确加载系统的 JDK 路径。

  • 解决 :在 /etc/sysconfig/logstash JAVA_HOME=/usr/local/jdk1.8.0_91systemctl daemon-reload 后重启。

  • 注:没有/etc/sysconfig/logstash的话就创建然后添加JAVA_HOME=/usr/local/jdk1.8.0_91字段后尝试重启

3. Filebeat 连接 Logstash 报 "connection refused"

  • 表现 :Filebeat 报 Failed to connect to backoff(async(tcp://IP:5044)): dial tcp ... connect: connection refused

  • 原因

    • Logstash 没有监听该 IP/端口;

    • Filebeat 指向了错误的 IP;

    • 防火墙阻挡 5044 端口。

  • 解决

    • ss -lntp | grep 5044 确认 Logstash 是否监听。

    • 校对 Filebeat 配置中的 hosts

    • 开放防火墙端口 firewall-cmd --add-port=5044/tcp --permanent.

    • 注:可能是没写logstash.conf配置文件。。。

4. Logstash Beats 插件报 "地址已在使用"

  • 表现 :Logstash 日志 Error: 地址已在使用 (Java::JavaNet::BindException)

  • 原因 :同一个 pipeline 里出现多个 beats { port => 5044 } 或多个 pipeline 抢同一端口。

  • 解决

    • /etc/logstash/conf.d/ 里只保留一个 beats input。

    • 或在 /etc/logstash/pipelines.yml 把不同 pipeline 分开。

    • 或者改用不同端口。

    • 注:可能是服务冲突了,停止服务后再logstash -f logstash.conf

5.Elasticsearch 报错问题:Java 环境找不到

错误现象

  • could not find java; set JAVA_HOME or ensure java is in PATH

  • 虽然系统中有 Java,但 Elasticsearch 服务运行时找不到

根本原因

  • Systemd 服务运行时使用独立的环境变量,不继承用户环境

  • Java 路径未在系统级配置中设置

解决方案

bash

复制代码
#在 Elasticsearch 配置中设置
sudo vi /etc/sysconfig/elasticsearch
添加:JAVA_HOME=/usr/local/jdk1.8.0_91

6. Kibana / Elasticsearch 配置小坑

  • Elasticsearch 集群节点名、IP、数据目录权限需提前设置好。

  • Kibana 的 server.host 要改为 0.0.0.0 才能外网访问。

  • 在 Kibana 中要根据实际索引模式创建 Index Pattern 才能看到数据。

相关推荐
StevenLdh2 小时前
Docker容器化部署简要指南
运维·docker·容器
RoboWizard2 小时前
传输无界 金士顿双接口U盘上新抽电脑
运维·人工智能·缓存·电脑·金士顿
Teamhelper_AR2 小时前
AR技术:轨道交通运维与安全保障的革新力量
运维·安全·ar
泽虞3 小时前
《C++程序设计》笔记p4
linux·开发语言·c++·笔记·算法
jnpher3 小时前
通过你的自有服务器代理网址
运维·服务器
什么半岛铁盒3 小时前
C++项目:仿muduo库高并发服务器--------Any类的实现
linux·服务器·数据库·c++·mysql·github
段振轩3 小时前
Docker数据卷
运维·docker·容器
love530love3 小时前
EPGF 架构为什么能保持长效和稳定?
运维·开发语言·人工智能·windows·python·架构·系统架构
吃不胖没烦恼3 小时前
Alibaba Cloud Linux 3 +Docker 部署 ThinkPHP6 (宝塔环境)
linux·运维·docker