ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)

发布于:2025-07-02 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、ELK 平台介绍

1、ELK 概述

        日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
        通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的 syslog,将所有服务器上的日志收集汇总。
        集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用 grep、awk 和 wc 等 Linux 命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
        开源实时日志分析 ELK 平台能够完美的解决我们上述的问题,ELK 由 ElasticSearch、Logstash 和 Kiabana 三个开源工具组成。

工具名称 简介
Elasticsearch 开源分布式搜索引擎,特点有分布式、零配置、自动发现、索引自动分片、索引副本机制、restful 风格接口、多数据源、自动搜索负载等
Logstash 完全开源工具,可对日志进行收集、过滤,存储供后续使用(如搜索 )
Kibana 开源免费工具,为 Logstash 和 Elasticsearch 提供日志分析友好的 Web 界面,助力汇总、分析和搜索重要数据日志

进行日志处理分析,一般需要经过一下几步:
(1)将日志进行集中化管理
(2)将日志格式化(Logstash)并输出到 Elasticsearch
(3)对格式化后的数据进行索引和存储(Elasticsearch)
(4)前端数据的展示(Kibana)

2、Elasticsearch

2.1、ElasticSearch 概述

        Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

2.2 Elasticsearch 核心概念

(1)接近实时(NRT)

        Elasticsearch 是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是 1 秒)。

(2)集群(cluster)

一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是 “elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

(3)节点(node)

        一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 Elasticsearch 集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做 “elasticsearch” 的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做 “elasticsearch” 的集群中。
在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何 Elasticsearch 节点,这时启动一个节点,会默认创建并加入一个叫做 “elasticsearch” 的集群。

(4)索引(index)

        一个索引是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

(5)类型(type)

        在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类 / 分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

(6)文档(document)

        一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。
在一个 index/type 里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引 / 赋予一个索引的 type。

(7)分片和复制(shards & replicas)

        一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的 “索引”,这个 “索引” 可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因:

1)允许你水平分割 / 扩展你的内容容量。

2)允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能 / 吞吐量。

        至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的。

        在一个网络 / 云的环境里,失败随时都可能发生,在某个分片 / 节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。

        复制之所以重要,有两个主要原因:在分片 / 节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原 / 主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量 / 吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
        默认情况下,Elasticsearch 中的每个索引被分片 5 个主分片和 1 个复制,在两个节点的场景中,每个索引将会有 5 个主分片和另外 5 个副本分片,每个索引总共就有 10 个分片。但是在 Elasticsearch 7.0 以后的版本中默认分片数做了调整中,默认索引的主分片(Primary Shards)数量为 1,副本分片(Replica Shards)数量为 1

3、Logstash

3.1 Logstash 介绍

Logstash 有 JRuby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出。Ligstash 具有强大的插件功能,常用于日志处理。
Logstash 的设计理念:Logstash 只做三件事,数据输入、数据加工、数据输出

3.2、Logstash 工作的三个阶段

(1)input 数据输入端,可以接收来自任何地方的源数据
插件 功能描述
file 从文件中读取
syslog 监听在 514 端口的系统日志信息,并解析成 RFC3164 格式
redis 从 redis - server list 中获取,并解析成 RFC3164 格式
beat 接收来自 Filebeat 的事件
(2)Filter 数据中转层,主要进行格式处理,数据类型转换、数据过滤、字段添加,修改等,常用的过滤器如下。
插件 功能描述
grok 通过正则解析和结构化任何文本
mutate 在事件字段执行一般的转换,可重命名、删除、替换和修改事件字段
drop 完全丢弃事件,如 debug 事件
clone 复制事件,可能添加或者删除字段
geoip 添加有关 IP 地址地理位置信息
(3)output 是 logstash 工作的最后一个阶段,负责将数据输出到指定位置,兼容大多数应用,常用的有:elasticsearch:发送事件数据到 Elasticsearch,便于查询,分析,绘图。
插件 功能描述
elasticsearch 发送事件数据到 Elasticsearch,便于查询、分析、绘图
file 将事件数据写入到磁盘文件上
mongodb 将事件数据发送至高性能 NoSQL mongodb,便于永久存储、查询、分析,大数据分片
redis 将数据发送至 redis - server,常用于中间层暂时缓存
graphite 发送事件数据到 graphite

4、Kibana

4.1 Kibana 介绍

        Kibana 是一个设计使用和 Elasticsearch 配置工作的开源分析和可视化平台。可以用它进行搜索、查看、集成 Elasticsearch 中的数据索引。可以利用各种图表、报表、地图组件轻松的对数据仅进行可视化分析

4.2、Kibana 主要功能

Elasticsearch 无缝集成
整合数据
复杂数据分析
让更多的团队成员收益
接口灵活
配置简单
可视化多数据源
简单数据导出

二、实验案例

拓扑

资源列表

主机名 ip 地址 操作系统 软件包
- 192.168.10.101 Openeuler24 filebeat、httpd
- 192.168.10.102 Openeuler24 logstash
elk1 192.168.10.103 Openeuler24 Elasticsearch、kibana
elk2 192.168.10.104 Openeuler24 Elasticsearch

1、基础配置

1.1、关闭防火墙及内核保护

hostnamectl set-hostname elk1
hostnamectl set-hostname elk2

vim /etc/hosts
###添加内容###
192.168.10.103 elk1
192.168.10.104 elk2

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

vim /etc/selinux/config
###编辑内容###
SELINUX=disabled

1.2、添加程序用户

useradd elk
passwd elk              ###密码“elk”###

###加入到wheel组中
gpasswd -a elk wheel


###关闭命令使用认证
visudo

###编辑内容###
%wheel ALL=(ALL)       NOPASSWD: ALL        ###110行


###切换到程序用户并加载完整的环境###
su - elk

1.3、部署环境

sudo dnf -y install java

1.4、修改用户可用的硬件资源

sudo vim /etc/security/limits.conf
###添加内容###
elk soft nofile 65535
elk hard nofile 65535
elk soft nproc  65535
elk hard nproc  65535
elk soft memlock unlimited
elk hard memlock unlimited

1.5、从内核方面为进程分配更大的可用内存区

sudo vim /etc/sysctl.conf
###添加内容###
vm.max_map_count=655360

1.6、重启加载配置文件

sudo reboot

2.安装elasticsearch

2.1、切换到指定目录拉取安装包

cd /opt
su - elk

2.2、解压elasticsearch并移动到合适位置

sudo tar zxf elasticsearch-7.10.0-linux-x86_64.tar.gz
sudo mv elasticsearch-7.10.0 /usr/local/elasticsearch

2.3、编辑JAVA文件

sudo vim /usr/local/elasticsearch/config/jvm.options
###编辑内容###
-Xms2g
-Xmx2g

2.4、修改elasticsearch配置文件

sudo vim /usr/local/elasticsearch/config/elasticsearch.yml

###编辑内容###
cluster.name: aaa
node.name: elk1
path.data: /path/to/data
path.logs: /path/to/logs
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["elk1", "elk2"]
cluster.initial_master_nodes: ["elk1"]

2.5、创建数据存放路径

sudo mkdir -p /path/to/data
sudo mkdir -p /path/to/logs
sudo chown -R elk:elk /path
sudo chown -R elk:elk /usr/local/elasticsearch/

2.6、启动并查看监听

/usr/local/elasticsearch/bin/elasticsearch &
netstat -anpt | grep 9200

3、安装logstash

3.1、关闭防火墙及内核保护

systemctl stop firewalld
setenforce 0
dnf -y install java
tar zxf logstash-7.10.0-linux-x86_64.tar.gz
mv logstash-7.10.0 /usr/local/logstash
chmod -R 777 /usr/local/logstash/data/

3.2、编辑配置文件

chmod o+r /var/log/messages
touch /usr/local/logstash/system.conf
vim /usr/local/logstash/system.conf

###编辑内容###
input {
        file {
                path => "/var/log/messages"
                type => "system"
                start_position => "beginning"

             }

}


output {

        elasticsearch {
                        hosts=> ["192.168.10.103:9200","192.168.10.104:9200"]
                        index=> "system-%{+YYYY.MM.dd}"



                        }

}

3.3、启动并查看监听

/usr/local/logstash/bin/logstash -f /usr/local/logstash/system.conf &
netstat -anpt | grep java

4、部署filebeat

4.1、安装apache

systemctl stop firewalld
setenforce 0
dnf -y install httpd
systemctl start httpd
echo "filebeataaaaaa" > /var/www/html/index.html

4.2、安装filebeat

tar zxf filebeat-7.10.0-linux-x86_64.tar.gz
mv filebeat-7.10.0-linux-x86_64 /usr/local/filebeat
cd /usr/local/filebeat/
mv filebeat.yml filebeat.yml.bak
vim filebeat.yml
###编辑内容###
filebeat.inputs:
- type: log
  paths:
    - /var/log/httpd/access_log


output.logstash:
  hosts: ["192.168.10.102:5044"]

###检查配置文件###
./filebeat test config -c filebeat.yml

4.3、修改用户可用的硬件资源

vim /etc/security/limits.conf
###编辑内容###
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited

vim /etc/sysctl.conf
###编辑内容###
vm.max_map_count=655360

4.4、启动filebeat服务

/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml &

4.5、查看监听

netstat -anpt | grep filebeat

4.6、修改 logstash 的配置文件,使日志输出到 elasticsearch

vim /usr/local/logstash/config/beats.conf
###编辑内容###
input {
  beats {
    port => "5044"
    codec => "json"
  }
}

output {
  elasticsearch {
    hosts => ["192.168.10.103:9200"]
    index => "weblog-beat-%{+YYYY.MM.dd}"
  }
}

4.7、运行服务

/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/beats.conf --path.data=/usr/local/logstash/config.d/web01 &

5、安装 Kibana

5.1、在 elk1 上安装 Kibana

tar zxf kibana-7.10.0-linux-x86_64.tar.gz
mv kibana-7.10.0-linux-x86_64 /usr/local/kibana

5.2、修改配置文件

vim /usr/local/kibana/config/kibana.yml
###编辑内容###
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.10.103:9200"]
kibana.index: ".kibana"
i18n.locale: "zh-CN"

5.3、修改归属并启动服务

chown -R elk:elk /usr/local/kibana/
su - elk
/usr/local/kibana/bin/kibana &

5.4、访问:

http://192.168.10.103:5601


网站公告

今日签到

点亮在社区的每一天
去签到