当前位置: 首页 > 科技观察

一文读懂开源日志管理方案ELK和EFK的区别

时间:2023-03-12 16:20:01 科技观察

一篇文章了解ELK和EFK的区别,一个开源的日志管理方案,一般也推荐使用Fluentd。我们来看看ELK到EFK的变化。同时也推荐大家了解下GrafanaLokiELK和EFK的概览。随着各种软件系统的复杂度越来越高,尤其是部署到云端之后,基本上不可能登录到各个节点查看各个模块的日志。因为它不仅效率低下,而且有时出于安全原因无法让工程师直接访问各个物理节点。而且现在大型软件系统基本都采用集群部署的方式,也就是说对于每一个服务,都会启动多个相同的POD对外提供服务,而每个容器都会产生自己的日志,只从产生的日志中产生,你根本不知道它是哪个POD生成的,这使得查看分布式日志变得更加困难。所以在云时代,需要一个收集和分析日志的方案。首先,需要将分布在各个角落的日志收集到一个集中的地方,方便查看。采集后可以进行各种统计分析,甚至可以使用流行的大数据或机器学习方法进行分析。当然,传统的软件部署方式也需要这样的日志解决方案,但本文主要从云端的角度进行介绍。ELK就是这样一种解决方案,并且基本上是事实上的标准。ELK是三个开源项目的首字母缩写,如下:E:ElasticsearchL:LogstashK:KibanaLogstash主要功能是收集和处理分布在各处的日志;Elasticsearch是一个集中存储日志的地方,更重要的是,它是一个全文搜索和分析引擎,可以让用户近乎实时地查看和分析海量数据。Kibana是为Elasticsearch开发的前端GUI,可以让用户通过图形界面方便地查询存储在Elasticsearch中的数据,同时也提供了各种分析模块,比如构建仪表盘的功能。我个人觉得把ELK中的L理解为LoggingAgent更合适。Elasticsearch和Kibana基本上是存储、检索和分析日志的标准解决方案,而Logstash并不是收集日志的唯一解决方案。Fluentd和Filebeats也可以用来收集日志。所以现在网上出现了ELK、EFK这样的缩写。总体架构如下图所示。通常一个小集群有三个节点,这三个节点上可能运行着几十个甚至上百个容器。而我们只需要在每个节点上启动一个loggingagent实例(kubernetes中DaemonSet的概念)即可。Filebeats、Logstash、Fluentd的区别和联系这里有必要对Filebeats、Logstash和Fluentd的联系和区别做一个简单的说明。Filebeats是一个用于收集本地日志数据的轻量级解决方案。Filebeats的官方说明如下。可见Filebeats的功能还是比较简单的。它只能收集本地日志,但不能对收集到的日志做任何事情。因此,Filebeats通常需要将收集到的日志发送给Logstash做进一步的处理。Filebeat是本地文件的日志数据传送器。Filebeat作为代理安装在你的服务器上,监控日志目录或特定的日志文件,跟踪文件,并将它们转发到Elasticsearch或Logstash进行索引Logstash和Fluentd都收集和处理日志网上有很多关于两者的比较,并提供了一篇写得更好的文章的链接,如下所示。从功能上来说,两者是等价的,但是Logstash会消耗更多的内存。Logstash的解决方案是使用Filebeats从每个叶子节点收集日志。当然Fluentd也有对应的FluentBit。https://logz.io/blog/fluentd-Logstash/另一个重要的区别是Fluentd有更好的抽象,将用户屏蔽在底层的繁琐细节中。作者原话是这样的:Fluentd的方式更偏向声明式,而Logstash的方式是过程式的。对于受过过程式编程训练的程序员来说,Logstash的配置可以更容易上手。另一方面,Fluentd的tag-basedroutingcleans允许复杂的路由被express。虽然作者说他想中立地比较两者(Logstash和Fluentd),但实际上偏见是显而易见的:)。这篇文章也是以Fluentd的介绍为主,但是大体思路是一样的。另外,Filebeats、Logstash、Elasticsearch和Kibana是同一个公司的开源项目,官方文档如下:https://www.elastic.co/guide/index.htmlFluentd是另一个公司的开源项目公司,官方文档如下:https://docs.fluentd.org关于ELKELK简介ELK是Elastic提供的一整套日志采集和展示解决方案。它是三个产品的首字母缩写,分别是Elasticsearch、Logstash和Kibana。Elasticsearch是一个实时的全文搜索和分析引擎,提供收集、分析和存储数据三大功能。Logstash是一个用于收集、分析和过滤日志的工具。Kibana是一个基于Web的图形界面,用于在Elasticsearch指标中搜索、分析和可视化存储在Log数据中的数据ELK日志处理流程上图为Docker环境下典型ELK方案下的日志收集处理流程:Logstash提取日志信息从每个Docker容器中,Logstash将日志转发到Elasticsearch进行索引和存储,Kibana负责分析和可视化日志信息。因为Logstash不擅长数据采集,而且作为Agent,性能也不达标。基于此,Elastic发布了beats系列轻量级集合组件。我们这里要练习的Beat组件是Filebeat。Filebeat建立在节拍之上。应用于日志收集场景的实现,用于替代LogstashForwarder的下一代Logstash收集器。Collectionwork,可以方便的和Logstash对接,也可以直接和Elasticsearch对接。本实验直接使用Filebeat作为Agent,会收集我们在第一篇文章《Docker logs & logging driver》介绍的json-file的日志文件中的记录变化,并直接将日志发送到Elasticsearch进行索引保存,及其处理流程变成下图,大家也可以认为可以叫EFK。ELK套件的安装本次实验中,我们使用Docker部署了一个ELK的最小运行环境。当然,在实际环境中,我们可能需要考虑高可用和负载均衡。先拉取sebp/elk的集成镜像。这里选择的tag版本是最新的:dockerpullsebp/elk:latest注意:由于包含了整个ELK方案,所以需要耐心等待一段时间。使用sebp/elk集成镜像通过以下命令启动运行ELK:dockerrun-it-d--nameelk\-p5601:5601\-p9200:9200\-p5044:5044\sebp/elk:latest运行后为完成,可以先访问http://192.168.4.31:5601看看Kibana的效果??:当然目前没有ES索引和数据可以展示,再访问http://192.168.4.31:9200查看Elasticsearch的API接口是否可用:如果在启动过程中发现一些错误,导致ELK容器无法启动,可以参考《ElasticSearch 启动常见错误》一文。如果你的主机内存低于4G,建议增加配置设置ESmemoryusage,避免启动失败。例如,以下添加的配置将ES内存使用限制为最大1G:dockerrun-it-d--nameelk\-p5601:5601\-p9200:9200\-p5044:5044\-eES_MIN_MEM=512m\-eES_MAX_MEM=1024m\sebp/如果elk:latest启动容器,提示maxvirtualmemoryareasvm.max_map_count[65530]太低,至少增加到[262144]请参考#Editsysctl.convi/etc/sysctl.conf#Add下面配置vm.max_map_count=655360#然后执行命令sysctl-pFilebeat配置安装Filebeat下载Filebeat这里我们通过rpm下载Filebeat,注意这里下载对应我们ELK的版本(ELK是7.6.1,这里也是下载7.6.1,避免出现Error):wgethttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpmrpm-ivhfilebeat-7.6.1-x86_64.rpm配置Filebeat这里需要告诉Filebeat要监控哪些日志文件以及将日志发送到哪里,所以我们需要修改Filebeat的配置:nano/etc/filebeat/filebeat.yml中要修改的内容是:(1)哪些日志监控filebeat.inputs:#Each-isaninput.Mostoptionscanbesetattheinputlevel,so#youcanusedifferentinputsforvariousconfigurations.#Belowwaretheinputspecificconfigurations.-type:log#Changetotruetoenablethisinputconfiguration.enabled:true#应抓取和获取的路径。基于全局的路径。路径:-/var/lib/docker/containers/*/*.log这里指定路径:/var/lib/docker/containers/*/*.log,另外需要注意的是设置enabled为true(2)将日志发送到哪里#------------------------Elasticsearchoutput------------------------------output.elasticsearch:#Arrayofhoststoconnectto.hosts:["192.168.4.31:9200"]#Optionalprotocolandbasicauthcredentials.#protocol:"https"#username:"elastic"#password:"changeme"这里指定直接发送给Elasticsearch,配置ES的接口地址。注意:如果要发送到Logstash,请使用如下配置,相关配置取消注释:#-------------------------Logstashoutput------------------------------#output.Logstash:#TheLogstashhosts#hosts:["localhost:9200"]#可选的SSL.Bydefaultisoff.#ListofrootcertificatesforHTTPSserververifications#ssl.certificate_authorities:["/etc/pki/root/ca.pem"]#CertificateforSSLclientauthentication#ssl.certificate:"/etc/pki/client/cert.pem"#ClientCertificateKey#ssl.key:"/etc/pki/client/cert.key"启动Filebeat由于Filebeat在安装时已经注册为systemd服务,所以直接启动即可:systemctlstartfilebeatsetbootstartup:systemctlenablefilebeatcheckFilebeatstartupStatus:systemctlstatusfilebeat以上操作总结为一个脚本:wgethttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpmrpm-ivhfilebeat-7.6.1-x86_64.rpmecho"pleaseinputelkhost_ip"readhost_ipsed-i"s/启用:假/启用:true/g"/etc/filebeat/filebeat.ymlsed-i"s/\/var\/log\/\*.log/\/var\/lib\/docker\/containers\/\*\/\*.log/g"/etc/filebeat/filebeat.ymlsed-i"s/localhost:9200/${host_ip}:9200/g"/etc/filebeat/filebeat.ymlsystemctlstartfilebeatsystemctlenablefilebeatsystemctlstatusfilebeatKibanaConfiguration接下来我们会告诉Kibana去查询分析Elasticsearch是哪个登录的文件,所以我们需要配置一个IndexPatternFromFilebeat,我们知道Index的格式是filebeat-timestamp,所以这里我们定义IndexPattern为filebeat-*ClickNextStep,这里我们选择TimeFilter字段nameas@timestamp:点击Createindexpattern按钮完成配置。这个时候我们点击Kibana左侧的Discover菜单,可以看到容器的日志信息:仔细看细节,我们关注一下message字段:可以看到,我们关注的是message,所以我们也可以filter看看这个字段的信息就可以了:这里只是简单的展示了导入ELK的日志信息。其实ELK有很多丰富的玩法,比如分析聚合,炫酷的Dashboard等等。笔者这里也是初步使用,所以这里介绍一下。Fluentd简介关于Fluentd在Fluentd之前,我们使用Filebeat来收集Docker日志信息。基于Docker默认的json-file日志驱动,这里使用开源项目Fluentd代替json-file来收集容器的日志。Fluentd是一个开源数据收集器,专为处理数据流而设计,使用JSON作为数据格式。它采用插件式架构,具有高扩展性和高可用性,同时也实现了高可靠的信息转发。Fluentd也是云原生基金会(CNCF)的成员项目之一,遵循Apache2许可协议,其GitHub地址为:https://github.com/fluent/fluentd/。与Logstash相比,Fluentd占用内存更少,社区更活跃。两者的比较可以参考这篇文章《Fluentd vs Logstash》。于是,整个日志采集处理流程就变成了下图。我们使用Filebeat将Fluentd收集的日志转发到Elasticsearch。当然,我们也可以使用Fluentd插件(fluent-plugin-elasticsearch)直接将日志发送到Elasticsearch,并根据自己的需要替换Filebeat,这样就形成了Fluentd=>Elasticsearch=>Kibana的架构,也称为EFK。运行Fluentd这里我们通过容器运行一个Fluentd收集器:dockerrun-it-d--namefluentd\-p2422??4:24224\-p2422??4:24224/udp\-v/etc/fluentd/log:/fluentd/log\fluent/fluentd:latest默认情况下,Fluentd将使用端口24224,其日志将收集在我们映射的路径下。另外,我们还需要修改Filebeat的配置文件,将/etc/fluentd/log添加到监控目录:#=============================Filebeatinputs=================================filebeat.inputs:#Each-isaninput。大多数选项可以在输入级别设置,所以#youcanusedifferentinputsforvariousconfigurations.#Belowaretheinputspecificconfigurations.-type:log#Changetotruetoenablethisinputconfiguration.enabled:true#Pathsthatshouldbecrawledandfetched.Globbasedpaths.paths:-/etc/fluentd/log/*.log添加监控配置后,需要重启filebeat:systemctlrestartfilebeat到运行测试容器为了验证效果,这里我们运行两个容器,并将其日志驱动设置为fluentd:dockerrun-d\--log-driver=fluentd\--log-optfluentd-address=localhost:24224\--log-opttag="test-docker-A"\busyboxsh-c'whiletrue;doecho"ThisisalogmessagefromcontainerA";sleep10;done;'dockerrun-d\--log-driver=fluentd\--log-optfluentd-address=localhost:24224\--log-opttag="test-docker-B"\busyboxsh-c'whiletrue;doecho"ThisisalogmessagefromcontainerB";sleep10;done;'这里通过指定容器的log-driver,并为每个容器设置一个tag,方便我们验证和查看日志来验证EFK的效果。此时再次进入Kibana查看日志信息,然后通过刚刚设置的标签信息过滤刚刚添加的容器的日志信息:模拟日志生成压力测试工具https://github.com/elastic/rallyhttps://pypi.org/project/log-generator/https://github.com/mingrammer/flog总结本文从ELK的基本组成入手,介绍了ELK的基本处理流程讲解,并搭建了ELK环境从0开始,演示了一个基于Filebeat收集容器日志信息的案例。然后,通过引入开源数据采集器Fluentd,演示了如何基于EFK采集日志。当然,ELK/EFK的知识点很多,笔者只是初步使用。希望以后能分享更多实用的总结。参考文章ElasticsearchReference开源日志管理方案ELK/EFK开源日志管理方案ELK/EFKELK构建云时代日志方案Kubernetes上搭建EFK日志采集系统Kubernetes基于EFK技术栈的日志采集实践