2023 年了,大厂的项目为什么会使用 ELK 作为可视化日志?

2023年 9月 24日 63.9k 0

📣 大家好,我是 Zhan,一名个人练习时长两年的大三后台练习生 💻

📣 这篇文章是 Java 日志框架 的第三篇学习笔记 📙

📣 如果有不对的地方,欢迎各位指正🙏🏼

📣 以始为终 —— Just do it!  🫵🏼🫵🏼🫵🏼

👉引言

在上篇文章 5 分钟带你告别几个 G 的日志文件,再也不会看的眼花缭乱了 中我们介绍了如何在 Springboot 中使用 LogBack 对日志进行开发和测试环境分离以及时间和大小分割日志,但是我们还是忽视了一些问题:

  • 为了保证高可用,我们一般会部署多节点,而多节点部署的场景下,将会有多个日志文件,导致日志难以定位,繁琐且低效
  • 无法对日志数据进行查询功能和分析功能

400

对于这类分布式的问题,我们一般都会引入中间件解决分布式的问题,而本文将会讲到这类日志服务的解决方案:ElasticSearch + Logstash + Kibana,“妈妈再也不用担心我找不到日志了”:

至此你就可以在 Kibana 可视化界面,看到所有的日志信息,对日志信息进行筛选、检索、可视化:

一、ELK 和 ELFK

有了上面的本人这一灵魂画手,相信读者对于 ELK 究竟如何帮助我们实现日志框架有了一定的理解,这里就再次赘述一下 ELK 三个组件各自的作用:

  • ElasticSearch: 是一个搜索和分析引擎,也是一个非关系型数据库(和 Redis 一样),由于倒排索引的缘故,ElasticSearch 的搜索性能很高,而我们搭建日志系统不需要了解 ElasticSearch 的语法
  • LogStash: 是一个服务端数据处理管道,用人话说就是,可以从各个服务器来源采集数据,对数据进行一定的筛选和处理,然后把数据输出到 ES 这样的数据库中,也就是解决了我们在引言中提到的多节点部署的问题
  • Kibana: 是一个可以把存储到 ES 中的数据使用图表和图形进行可视化,并可以让我们不懂 ES 语法的人对数据进行条件查询,也就是实现了我们在引言中说到的搜索和分析的问题

那为什么标题中还有一个 ELFK 呢?ELFK 其实表示的是 Beats + ElasticSearch + Logstash + Kibana。这其实是有两个原因:

  • 首先就是 Beats 会提供给我们一些模版,例如 Nginx,使用它的模版我们可以快速搭建一个 Nginx 的可视化界面
  • 再者就是 LogStash 其实是一个 Java 程序,对 CPU、内存、IO 的占用较高,因此 Elastic NV 也就是官方推出了使用 Go 语言写的 Beats 这一轻量级采集器,进行数据的采集,我们可以从文件大小中看出:

  • 因此架构就又演变成了下图:

至此,其实我们就大概能够知道 ELFK 的总体架构,也就是 ELK Stack,而下面我们将逐一搭建这些环境并介绍它们的基本使用

500

二、ElasticSearch

对于 ES 的介绍,我们沿用官网的话Elasticsearch:官方分布式搜索和分析引擎 | Elastic:

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。

注意事项

❗注意: 首先要声明两点部署的时候的注意事项:

  • 后续部署的几个组件要做到版本统一(例如 ES 是 7.15.2,那么 LogStash 也应该是 7.15.2)
  • 由于部署需要 Java 环境,相信大家都有,但是我也知道大家很多人都是用 JDK1.8,但是看图说话,也就是说我们最好使用 7.xx 版本

下载和部署

有了上述的说明,我们后续统一使用 7.5.1 版本进行学习和使用:Past Releases of Elastic Stack Software | Elastic,我的服务器是 ARM 架构,就下载的 ARM 版本

  • 把下载好的包传入服务器,使用 tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz 进行解压,就可以得到这样的文件目录:

  • 不难得出,其实它是一个 Java 程序,按照惯例我们可以在 bin 目录下找到它的执行文件,而在 config 目录中找到它的配置文件:

🧨踩雷: 如果此时你直接进入到 bin 目录使用 ./elasticsearch -d 运行的话不出意外的话你会报错(别问我怎么知道的 O.o):

原因: elasticsearch为了安全,不允许使用root用户启动,由于 ElasticSearch 可以接收用户输入的脚本并且执行,为了系统安全考虑,需要创建一个单独的用户用来运行 ElasticSearch。

解决方法: 创建一个用户组,并在该组中创建一个用户,给该组的用户赋予文档修改的权限仅仅是 ElasticSearch 这个目录下的权限:

# 创建 es 用户组
groupadd es
# 在该组下创建用户
useradd elasticsearch -g es -p123456
# 给这个用户赋予文档编辑权限
chown elasticsearch:es -R /usr/local/elk/elasticsearch-7.5.1
# 切换到这个用户
su elasticsearch
# 后台启动 ES
./elasticsearch -d

🧨踩雷: 咱就是说配置了用户组还要给用户组分配一定大小的内存区域,否则启动的时候还是会报错,别问我怎么知道的,我也不想知道,所以就需要进行以下操作:

# 在 /etc/security/limits.conf 中追加内容:
elasticsearch soft nofile 65535  
elasticsearch hard nofile 65535
# 使用 ulimit 让配置生效
ulimit -n 65536
# 修改 /etc/sysctl.conf 没有的话就进行追加
vm.max_map_count=655360
# 让配置生效
sysctl -p

最后我们就可以通过 curl 0.0.0.0:9200 访问到本地的 ES 了:

三、LogStash 部署

上面的方法是去官网进行下载,但是我们可以使用 wget 方法直接拿到对应的包,所以后续就使用 wget 下载并完成后续的部署:

  • 首先就是下载 wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.zip
  • 然后是解压 unzip logstash-7.5.1.zip
  • 可以发现它的目录结构与 ES 也大致相似,因为都是 Java 程序:

我们可以使用 nohup bin/logstash -f config/logstash-sample.conf & 启动程序,并查看 nohup.out 的日志查看是否成功启动:

而我们使用的配置文件就代表了 LogStash 这个管道的功能:

  • 【必选】输入(Input) 数据(包含但不限于日志)往往都是以不同的形式、格式存储在不同的系统中,而 Logstash 支持从多种数据源中收集数据(File、Syslog、MySQL、消息中间件等等)。
  • 【可选】过滤器(Filter) :实时解析和转换数据,识别已命名的字段以构建结构,并将它们转换成通用格式。
  • 【必选】输出(Output) :Elasticsearch 并非存储的唯一选择,Logstash 提供很多输出选择。

四、Beats

Beats 并不是单一的一种,它根据开发者的需求分为以下几种:

  • Filebeat :轻量型日志采集器。
  • Metricbeat :轻量型指标采集器。
  • Packetbeat :轻量型网络数据采集器。
  • Winlogbeat :轻量型 Windows 事件日志采集器。
  • Auditbeat :轻量型审计日志采集器。
  • Heartbeat :面向运行状态监测的轻量型采集器。
  • Functionbeat :面向云端数据的无服务器采集器。

其实上述中我们使用的最多的是 FileBeat 和 MetricBeat,前者用于采集日志文件,也就是 Springboot 输出的日志文件,而后者是进行服务的监控,例如 Nginx 的请求数、活跃的连接数……

而下面我们以 FileBeat 为例,搭建环境,实现简单的管道输送到 ES 中:

  • 首先就是下载 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-darwin-x86_64.tar.gz
  • 然后就是解压:tar -zxvf filebeat-7.5.1-darwin-x86_64.tar.gz
  • 可以看到目录结构和前面很明显差别,因为它使用 Go 语言写的:

  • 所以这里简单解释一下:配置文件就是 filebeat.yml,而可执行文件就是 filebeat
  • 注意:如果此处的二进制文件启动不了,大家可以自己去官网进行下载对应的版本,因为这个版本可能和大家的 Linux 的版本不是很符合

然后我们可以看到它的配置文件中我们主要需要配置的三个部分:

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/ws/ws-manage.log
    #- c:programdataelasticsearchlogs*
#-------------------------- Elasticsearch output ------------------------------
# output.elasticsearch:
  # hosts: ["localhost:9200"]
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"
#----------------------------- Logstash output --------------------------------
output.logstash:
  hosts: ["localhost:5044"]

这里我们使用 LogStash 记录日志,而不是直接输入到 ElasticSearch 中

修改好配置文件之后我们就可以启动了: nohup ./filebeat &

五、Kibana

用官网 Kibana:数据的探索、可视化和分析 | Elastic 的话来介绍 Kibana:

使用 Kibana 针对大规模数据快速运行数据分析,以实现可观测性、安全和搜索。对来自任何来源的任何数据进行全面透彻的分析,从威胁情报到搜索分析,从日志到应用程序监测,不一而足。

部署到这里,其实主要的流程我们都已经清楚了,所以这里直接 po 代码:

# 下载  
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-darwin-x86_64.tar.gz  
  
# 解压  
$ tar -zxvf kibana-7.5.1-darwin-x86_64.tar.gz  
$ cd kibana-7.5.1-darwin-x86_64

# 配置配置文件 注意的是这里的配置文件都已经写好 只需要把注释去掉即可
server.port: 5601  
server.host: "0.0.0.0"  
elasticsearch.hosts: ["http://localhost:9200"]  
kibana.index: ".kibana"

# 启动
nohup bin/kibana &

# 访问
http://127.0.0.1:5601/

💬 总结

本文首先讲了使用常规的日志框架的缺点,也就是没有检索和筛选功能,并且对于多节点部署查看日志更是不方便,因此就引入了 ELK 这种方式,虽然解决的方式不止这一种,例如 阿里云、腾讯云 的服务也可以做到。

而由于 LogStash 是一个重量级的应用,Elastic 官方使用 Go 语言编写的 Beats 减轻了服务器的 IO、CPU、内存 负担,也就是所谓的 ELFK 架构,而其中四个服务的作用也在本文中进行了讲解:

  • LogStash:日志收集管道
  • Beats:主要使用 File 和 Metric 两种,用于采集日志
  • ElasticSearch:用于存储和检索日志,是一个非关系型数据库
  • Kibana: 让 ES 可视化,图形化界面让我们更方便进行日志的检索和分析

由于篇幅问题,我把与 Springboot 也就是项目的结合放在了下一篇博客,究竟 ELK 能和我们的项目结合到什么样的程度,能方便我们开发者多少,敬请期待!

🍁 友链

  • 5 分钟带你告别几个 G 的日志文件,再也不会看的眼花缭乱了! - 掘金 (juejin.cn)
  • 阿里面试:说了多少遍要用门面模式的日志框架? - 掘金 (juejin.cn)
  • 芋道 ELK(Elasticsearch + Logstash + Kibana) 极简入门
  • 芋道 Spring Boot 日志平台 ELK + Filebeat 入门
  • Elastic Stack:Elasticsearch、Kibana、Beats 和 Logstash | Elastic
  • 16.Kibana入门之Nginx 日志仪表盘_哔哩哔哩_bilibili
  • 最新elasticsearch版本与jdk版本对应图

✒写在最后

都看到这里啦~,给个点赞再走呗~,也欢迎各位大佬指正以及补充,在评论区一起交流,共同进步!也欢迎加微信一起交流:Goldfish7710。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论