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

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

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

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

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


👉引言

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

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

对于这类分布式的问题,我们一般都会引入中间件解决分布式的问题,而本文将会讲到这类日志服务的解决方案: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,而下面我们将逐一搭建这些环境并介绍它们的基本使用


二、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 这个目录下的权限:

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

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

shell 复制代码
# 在 /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 的版本不是很符合

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

yml 复制代码
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/ws/ws-manage.log
    #- c:\programdata\elasticsearch\logs\*
#-------------------------- 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 代码:

shell 复制代码
# 下载  
$ 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 能和我们的项目结合到什么样的程度,能方便我们开发者多少,敬请期待!


🍁 友链


✒写在最后

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

相关推荐
hengzhepa1 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
bubble小拾9 小时前
ElasticSearch高级功能详解与读写性能调优
大数据·elasticsearch·搜索引擎
不能放弃治疗10 小时前
重生之我们在ES顶端相遇第 18 章 - Script 使用(进阶)
elasticsearch
hengzhepa10 小时前
ElasticSearch备考 -- Search across cluster
学习·elasticsearch·搜索引擎·全文检索·es
Elastic 中国社区官方博客12 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
慕雪华年13 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
Elastic 中国社区官方博客15 小时前
使用 Vertex AI Gemini 模型和 Elasticsearch Playground 快速创建 RAG 应用程序
大数据·人工智能·elasticsearch·搜索引擎·全文检索
alfiy16 小时前
Elasticsearch学习笔记(四) Elasticsearch集群安全配置一
笔记·学习·elasticsearch
alfiy17 小时前
Elasticsearch学习笔记(五)Elastic stack安全配置二
笔记·学习·elasticsearch
丶21361 天前
【大数据】Elasticsearch 实战应用总结
大数据·elasticsearch·搜索引擎