赞
踩
前言
随着企业级应用系统日益复杂,随之产生的海量日志数据。传统的日志管理和分析手段,难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下,ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索、日志分析和数据可视化相关的产品。提到 ELKF 时,指的是 Elasticsearch、Logstash、Kibana 和 Filebeat 这四个工具的组合,ELKF 提供了一个完整的解决方案,用于收集、存储、搜索、分析和可视化各种类型的数据,尤其适用于日志管理和监控。本文将从 ELK 日志分析系统的原理、架构及其在实践中的应用做相关介绍。
目录
6. 在 Logstash 组件所在节点上新建一个 Logstash 配置文件
7. 浏览器访问 http://192.168.190.100:5601
ELK 和 ElasticStack 实质上指的是同一个概念,ELK 平台是一套完整的日志集中处理方案。其拥有三个组件:ElasticSearch、Logstash 和 Kiabana 配合使用组成一个功能全面的数据平台。另外,当需要处理大量实时数据的场景,ELK 与 Kafka 的集成可以提供一个强大的实时数据收集、存储、分析和可视化解决方案。
提供了一个分布式多用户能力的全文搜索和分析引擎,可以把日志集中化管理。Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。
下面是标准的 HTTP 方法与 RESTful 资源管理之间的映射关系:
核心概念:
由 Ruby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具。其主要功能是收集日志,输入采集的数据进行加工(如过滤、改写等)以及数据的输出。相关概念有:input(数据采集)、filter(数据过滤)和 output(数据输出)。
主要主件有:
由于 Logstash 运行在 jvm 虚拟机环境中,比较占用 cpu、内存资源,可以添加其它组件直接在操作系统运行:
针对 Elasticsearch 的开源分析及可视化平台,搜索查看索引中的数据。Kibana 通常与 Elasticsearch 一起部署,对接 Es 接口。
① 日志数据首先由应用程序产生。这些日志可能是应用程序运行时生成的标准输出、错误输出,或者是通过API直接输出的日志事件。例如,Web服务器、数据库服务、微服务等各类应用都会产生日志信息
② Kafka、Redis 可以起到缓冲的作用,暂时存储本地的日志数据直到成功发送出去,避免数据丢失;同时具有抗高并发能力,存储速度快等特点
③ Logstash 接收到来自缓冲区的日志数据后,进入数据解析区。在这里,Logstash通过配置的输入插件(Input Plugins)读取数据,然后经过过滤插件(Filter Plugins)进行解析和转换,最后输出数据(Output)
④ 经过解析和处理后的日志数据,最终被发送到Elasticsearch中存储。Elasticsearch 是一个分布式搜索引擎和分析引擎,它将数据按照索引(index)组织,并将索引进一步划分为多个分片(shards)以实现水平扩展和高可用性
⑤ Kibana 是一个强大的可视化工具,它连接到 Elasticsearch,可以从存储在 Elasticsearch 中的日志数据构建实时仪表板和报表。开发人员和运维团队可以通过 Kibana 的搜索和可视化功能
① 在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash
② Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中
③ Elasticsearch 对格式化后的数据进行索引和存储
④ Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示
总结:logstash 作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch 存储,kibana 对日志进行可视化处理。
节点名 | ip地址 | 安装软件 |
node1 | 192.168.190.100 | elasticsearch、kibana |
node2 | 192.168.190.101 | elasticsearch |
logstash | 192.168.190.102 | apache、logstash |
- systemctl stop firewalld.service
- setenforce 0
- # 关闭防火墙、核心防护功能
- node1节点:hostnamectl set-hostname node1
- node2节点:hostnamectl set-hostname node2
- logstash节点:hostnamectl set-hostname logstash
- # 修改主机名,方便查看
- echo 192.168.190.100 node1 >> /etc/hosts
- echo 192.168.190.101 node2 >> /etc/hosts
- echo 192.168.190.102 logstash >> /etc/hosts
- # 编辑域名解析,制作映射
- [root@node1 ~]# java -version
- openjdk version "1.8.0_131"
- [root@node2 ~]# java -version
- openjdk version "1.8.0_131"
- # 显示 Java 运行时环境版本信息,如果没有:yum -y install java

实际生产环境中常常会部署更多的节点来增强冗余能力、高可用性、负载均衡、数据扩容等,这里部署两台(在Node1、Node2节点上操作)。
① 安装 elasticsearch rpm 包
- 分别在node1、node2节点上操作:
- [root@node1 opt]# ls
- elasticsearch-5.5.0.rpm # 这里使用 elasticsearch-5.5.0.rpm 包
- [root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
-
- [root@node1 opt]# systemctl daemon-reload
- [root@node1 opt]# systemctl enable elasticsearch.service
- # 加载系统服务
② 修改 elasticsearch 主配置文件
- [root@node1 ~]# rpm -qc elasticsearch
- /etc/elasticsearch/elasticsearch.yml
- [root@node1 ~]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
- # 备份配置文件
- [root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
- 17 cluster.name: my-application # 取消注释,指定集群名字,名字可以按需修改
- 23 node.name: node1 # 取消注释,指定节点名字:node1、Node2
- 33 path.data: /data/elk_data # 取消注释,指定数据存放路径
- 37 path.logs: /var/log/elasticsearch/ # 取消注释,指定日志存放路径
- 43 bootstrap.memory_lock: false # 取消注释,改为在启动的时候不锁定内存
- 55 network.host: 0.0.0.0 # 取消注释,设置监听地址,0.0.0.0代表所有地址
- 59 http.port: 9200 # 取消注释,ES 服务的默认监听端口为9200
- 68 discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2
-
- [root@node1 ~]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml # 显示去除了注释的配置内容
③ 创建数据存放路径并授权
- [root@node1 ~]# mkdir -p /data/elk_data
- [root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data/
④ 启动 elasticsearch 是否成功开启
- [root@node1 ~]# systemctl start elasticsearch.service
- [root@node1 ~]# netstat -antp | grep 9200 # 启动的有点慢需要等一会
- tcp6 0 0 :::9200 :::* LISTEN 2541/java
⑤ 查看节点信息
浏览器访问 http://192.168.190.100:9200 、 http://192.168.190.101:9200 查看节点 Node1、Node2 的信息:
浏览器访问查看群集的健康情况
status 值:
浏览器访问 http://192.168.190.100:9200/_cluster/state?pretty 可以检查群集状态信息。使用上述方式查看群集的状态对用户并不友好,可以通过安装 Elasticsearch-head 插件,可以更方便地管理群集。
安装 Elasticsearch-head 插件的主要作用是为 Elasticsearch 提供一个可视化的 Web 界面,方便用户管理和监控 Elasticsearch 集群。
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。
① 编译安装 node
- [root@node1 opt]# yum install gcc gcc-c++ make -y # 安装编译工具
- [root@node1 opt]# ls
- elasticsearch-5.5.0.rpm node-v8.2.1.tar.gz # 准备软件包 node-v8.2.1.tar.gz
- [root@node1 opt]# tar zxvf 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 && make install
② 安装 phantomjs(前端的框架)
- [root@node1 opt]# ls
- phantomjs-2.1.1-linux-x86_64.tar.bz2 # 准备软件包
- [root@node1 opt]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
- [root@node1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
- [root@node1 bin]# cp phantomjs /usr/local/bin
③ 安装 Elasticsearch-head 数据可视化工具
- [root@node1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
- [root@node1 opt]# cd /usr/local/src/elasticsearch-head/
- [root@node1 elasticsearch-head]# npm install
④ 修改 Elasticsearch 主配置文件
- [root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
- http.cors.enabled: true # 开启跨域访问支持,默认为 false
- http.cors.allow-origin: "*" # 指定跨域访问允许的域名地址为所有
- [root@node1 ~]# systemctl restart elasticsearch
⑤ 启动 Elasticsearch-head 服务
必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败。
- [root@node1 ~]# cd /usr/local/src/elasticsearch-head/
- [root@node1 elasticsearch-head]# npm run start & # 后台启动应用程序
- [1] 85478
- [root@node1 elasticsearch-head]#
- > 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
⑥ 通过 Elasticsearch-head 查看 Elasticsearch 信息
通过浏览器访问 http://192.168.190.100:9100/ 地址并连接群集。如果看到群集健康值为 green 绿色,代表群集很健康。
- [root@node1 ~]# lsof -i:9100 # 列出所有打开指定TCP或UDP端口(这里是9100)的进程信息
- COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- grunt 85488 root 12u IPv4 98596 0t0 TCP *:jetdirect (LISTEN)
⑦ 插入索引
- [root@node1 ~]# curl -X PUT 'localhost:9200/index-demo1/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
- # 使用 curl 工具向 Elasticsearch 发送一个 PUT 请求,用于创建或更新索引中的文档
- # curl:是一个命令行工具,用于发送各种类型的 HTTP 请求
- # -X PUT:指定了 HTTP 请求的方法为 PUT,表示要创建或更新资源
- # -H 'content-Type: application/json':这部分设置了 HTTP 请求头,指定了请求体的内容类型为 JSON 格式
- # -d '{"user":"zhangsan","mesg":"hello world"}':这是请求的数据部分,包含了要存储的文档内容,以 JSON 格式提供
- {
- "_index" : "index-demo1",
- "_type" : "test",
- "_id" : "1",
- "_version" : 1,
- "result" : "created",
- "_shards" : {
- "total" : 2,
- "successful" : 2,
- "failed" : 0
- },
- "created" : true
- }

浏览器访问 http://192.168.190.100:9100/ 查看索引信息,可以看见索引默认被分片5个,并且有一个副本。点击“数据浏览”,会发现在node1上创建的索引为 index-demo,类型为 test 的相关信息。
Logstash 一般部署在需要监控其日志的服务器。
① 安装Apahce服务(httpd)
- [root@logstash ~]# yum -y install httpd
- [root@logstash ~]# systemctl start httpd.service
② 检查安装 Java 环境
- [root@logstash ~]# java -version
- openjdk version "1.8.0_131"
- # 显示 Java 运行时环境版本信息,如果没有:yum -y install java
③ 安装 logstash
- [root@logstash opt]# ls
- logstash-5.5.1.rpm # 准备 logstash-5.5.1.rpm 包
- [root@logstash opt]# rpm -ivh logstash-5.5.1.rpm
- [root@logstash opt]# systemctl start --now enable logstash.service
- [root@logstash opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
④ 测试 Logstash
Logstash 命令常用选项:
- -f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
- -e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
- -t:测试配置文件是否正确,然后退出。
定义输入和输出流:输入采用标准输入,输出采用标准输出(类似管道)
- [root@logstash ~]# logstash -e 'input { stdin{} } output { stdout{} }'
- www.baidu.com # 键入内容(标准输入)
- 2024-04-10T13:43:30.574Z logstash www.baidu.com # 输出结果(标准输出)
- www.sina.com.cn
- 2024-04-10T13:44:18.445Z logstash www.sina.com.cn
使用 rubydebug 输出详细格式显示,codec 为一种编解码器:
- [root@logstash ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
- www.baidu.com # 键入内容(标准输入)
- {
- "@timestamp" => 2024-04-10T13:48:25.820Z, # 输出结果(处理后的结果)
- "@version" => "1",
- "host" => "logstash",
- "message" => "www.baidu.com"
- }
使用 Logstash 将信息写入 Elasticsearch 中:
- [root@logstash ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.190.100:9200"] } }'
- # -e 选项允许你直接在命令行中提供 Logstash 配置,而不必使用独立的配置文件
- www.baidu.com # 键入内容(标准输入)
结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问 http://192.168.190.100:9100/ 查看索引信息和数据浏览:
① 定义 logstash 配置文件
- Logstash 配置文件基本由三部分组成:input、output 以及 filter(可选,根据需要选择使用)。
- input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等
- filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式
- output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch。
-
- 格式如下:
- input {...}
- filter {...}
- output {...}
-
- 在每个部分中,也可以指定多个访问方式。例如,若要指定两个日志来源文件,则格式如下:
- input {
- file { path =>"/var/log/messages" type =>"syslog"}
- file { path =>"/var/log/httpd/access.log" type =>"apache"}
② 修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中
- [root@logstash ~]# vim /etc/logstash/conf.d/system.conf
- vim /etc/logstash/conf.d/system.conf
- input {
- file{
- path =>"/var/log/messages" # 指定要收集的日志的位置
- type =>"system" # 自定义日志类型标识
- start_position =>"beginning" # 表示从开始处收集
- }
- }
- output {
- elasticsearch { # 输出到 elasticsearch
- hosts => ["192.168.190.100:9200"] # 指定 elasticsearch 服务器的地址和端口
- index =>"system-%{+YYYY.MM.dd}" # 指定输出到 elasticsearch 的索引格式
- }
- }
- [root@logstash ~]# chmod +r /var/log/messages
- [root@logstash ~]# systemctl restart logstash

浏览器访问 http://192.168.190.100:9100/ 查看索引信息:
用于可视化和管理Elasticsearch中数据的开源分析和可视化平台。Kibana提供了丰富的图表、仪表盘和数据可视化工具,使用户能够以直观的方式探索和分析数据。(在 Node1 节点上操作)
① 安装 Kiabana
- [root@node1 opt]# ls
- kibana-5.5.1-x86_64.rpm # 安装包
- [root@node1 opt]# rpm -ivh kibana-5.5.1-x86_64.rpm
② 设置 Kibana 的主配置文件
- [root@node1 opt]# vim /etc/kibana/kibana.yml
- 2 server.port: 5601 # 取消注释,Kiabana 服务的默认监听端口为5601
- 7 server.host: "0.0.0.0" # 取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
- 21 elasticsearch.url: "http://192.168.190.100:9200" # 取消注释,设置和 Elasticsearch 建立连接的地址和端口
- 30 kibana.index: ".kibana" # 取消注释,设置在 elasticsearch 中添加.kibana索引
③ 启动 Kibana 服务
- [root@node1 opt]# systemctl start --now enable kibana.service
- [root@node1 opt]# netstat -natp | grep 5601
- tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 2808/node
④ 验证 Kibana
浏览器访问 http://192.168.190.100:5601:
- 第一次登录需要添加一个 Elasticsearch 索引:
- Index name or pattern
- //输入:system-* #在索引名中输入之前配置的 Output 前缀“system”
-
- 单击 “create” 按钮创建,单击 “Discover” 按钮可查看图表信息及日志信息。
- 数据展示可以分类显示,在“Available Fields”中的“host”,然后单击 “add”按钮,可以看到按照“host”筛选后的结果
⑤ 将 Apache 服务器的日志(访问的、错误的)添加到 Elasticsearch 并通过 Kibana 显示
- [root@logstash ~]# 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.190.100:9200"]
- index => "apache_access-%{+YYYY.MM.dd}"
- }
- }
- if [type] == "error" {
- elasticsearch {
- hosts => ["192.168.190.100:9200"]
- index => "apache_error-%{+YYYY.MM.dd}"
- }
- }
- }
-
- [root@logstash ~]# cd /etc/logstash/conf.d/
- [root@logstash conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf

浏览器访问 http://192.168.190.100:9100 查看索引是否创建:
浏览器访问 http://192.168.190.100:5601 登录 Kibana,单击“Create Index Pattern”按钮添加索引, 在索引名中输入之前配置的 Output 前缀 apache_access-*,并单击“Create”按钮。在用相同的方法添加 apache_error-*索引。
选择“Discover”选项卡,在中间下拉列表中选择刚添加的 apache_access-* 、apache_error-* 索引, 可以查看相应的图表及日志信息。
ELKF 指的是 Elasticsearch、Logstash、Kibana 和 Filebeat,Filebeat 是 Elastic 公司推出的一款轻量级的数据采集器,用于将日志文件和其他数据发送到 Elasticsearch 或 Logstash。下载地址:下载 Elastic 产品 | Elastic
节点名 | ip地址 | 安装软件 |
node1 | 192.168.190.100 | elasticsearch、kibana |
node2 | 192.168.190.101 | elasticsearch |
logstash | 192.168.190.102 | apache、logstash |
filebeat | 192.168.190.103 | filebeat |
在 192.168.190.103,filebeat 节点操作:
- [root@localhost ~]# hostnamectl set-hostname filebeat # 修改节点主机名称
- [root@filebeat ~]# systemctl stop firewalld.service
- [root@filebeat ~]# setenforce 0
- [root@filebeat opt]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz
- [root@filebeat opt]# ls
- filebeat-6.2.4-linux-x86_64.tar.gz # 准备安装包
- [root@filebeat opt]# tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz
- [root@filebeat opt]# mv filebeat-6.2.4-linux-x86_64/ /usr/local/filebeat
- [root@filebeat ~]# vim /usr/lib/systemd/system/filebeat.service
- [Unit] # 定义了系统单元的基本信息
- Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
- # 描述了服务的作用,这里是Filebeat用于发送日志文件到Logstash或直接到Elasticsearch
- Wants=network‐online.target
- After=network‐online.target # 启动这个服务之前需要先启动 network-online.target
- [Service] # 定义了服务的运行参数
- User=root
- Group=root
- Environment="BEAT_CONFIG_OPTS=-c /usr/local/filebeat/filebeat.yml"
- # 设置了环境变量 BEAT_CONFIG_OPTS,该变量被设置为 -c /usr/local/filebeat/filebeat.yml,这样Filebeat将使用指定的配置文件
- ExecStart=/usr/local/filebeat/filebeat $BEAT_CONFIG_OPTS
- # 定义了服务启动时执行的命令,这里是启动Filebeat并传递 BEAT_CONFIG_OPTS 环境变量
- Restart=always # 指定了服务在发生错误时应该自动重启
- [Install] # 定义了服务的安装相关信息
- WantedBy=multi‐user.target # 指定了当系统以多用户模式启动时,这个服务应该被启动

- [root@filebeat ~]# vim /usr/local/filebeat/filebeat.yml
- 15 filebeat.prospectors:
- 21 - type: log # 指定 log 类型,从日志文件中读取消息
- 24 enabled: true
- 27 paths:
- 28 - /var/log/messages # 指定监控的日志文件
- 29 - /var/log/*.log
- 46 fields: # 可以使用 fields 配置选项设置一些参数字段添加到 output 中
- 47 service_name: filebeat
- 48 log_type: log
- 49 service_id: 192.168.190.103
- 146 #-------------------------- Elasticsearch output ------------------------------
- # 全部注释
- 156 #----------------------------- Logstash output --------------------------------
- 157 output.logstash:
- 159 hosts: ["192.168.190.102:5044"] # #指定 logstash 的 IP 和端口

- [root@filebeat ~]# systemctl start filebeat.service
- [root@filebeat ~]# systemctl status filebeat.service
- ● filebeat.service - Filebeat sends log files to Logstash or directly to Elasticsearch.
- Loaded: loaded (/usr/lib/systemd/system/filebeat.service; disabled; vendor preset: disabled)
- Active: active (running) since 四 2024-04-11 15:09:28 CST; 5s ago
- 或者使用:
- [root@filebeat ~]# cd /usr/local/filebeat/
- [root@filebeat ~]# ./filebeat -e -c filebeat.yml
- # ./filebeat: 表示执行当前目录下的Filebeat可执行文件
- # -e: 参数表示启用Filebeat的环境模式
- # 参数 -c 指定了Filebeat应使用的配置文件路径
- [root@logstash ~]# cd /etc/logstash/conf.d
- [root@logstash conf.d]# vim logstash.conf
- input { # 输入部分
- beats { # 指定了一个输入插件,使用 Beats 输入插件来接收数据
- port => "5044" # 指定了 Beats 插件监听的端口为 5044
- }
- }
- output { # 输出部分
- elasticsearch { # Elasticsearch 输出插件:指定将数据发送到 Elasticsearch 中
- hosts => ["192.168.190.100:9200"]
- index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
- }
- stdout { # Stdout 输出插件:这个插件用于在标准输出中显示调试信息
- codec => rubydebug # 来格式化输出,使得在标准输出中能够以易读的方式查看数据
- }
- }

单击“Create Index Pattern”按钮添加索引“filebeat-*”,单击 “create” 按钮创建,单击 “Discover” 按钮可查看图表信息及日志信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。