您现在的位置是:首页 > 科技前沿

开发利器丨如何使用ELK设计微服务中的日志收集方案?

智慧创新站 2025-04-01【科技前沿】69人已围观

简介微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中的日志收集方案ELK(ELK是Elasticsearch、Logstash、Kibana的简称),准确的说是E...

微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。

我们将重点介绍微服务架构中的日志收集方案ELK(ELK是Elasticsearch、Logstash、Kibana的简称),准确的说是ELKB,即ELK+Filebeat,其中Filebeat是用于转发和集中日志数据的轻量级传送工具。

一、为什么需要分布式日志系统

在以前的项目中,如果想要在生产环境需要通过日志定位业务服务的bug或者性能问题,则需要运维人员使用命令挨个服务实例去查询日志文件,导致的结果是排查问题的效率非常低。

微服务架构下,服务多实例部署在不同的物理机上,各个微服务的日志被分散储存不同的物理机。集群足够大的话,使用上述传统的方式查阅日志变得非常不合适。因此需要集中化管理分布式系统中的日志,其中有开源的组件如syslog,用于将所有服务器上的日志收集汇总。

然而集中化日志文件之后,我们面临的是对这些日志文件进行统计和检索,哪些服务有报警和异常,这些需要有详细的统计。所以在之前出现线上故障时,经常会看到开发和运维人员下载了服务的日志,基于Linux下的一些命令,如grep、awk和wc等,进行检索和统计。这样的方式效率低,工作量大,且对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

二、ELKB分布式日志系统

ELKB是一个完整的分布式日志收集系统,很好地解决了上述提到的日志收集难,检索和分析难的问题。ELKB分别是指Elasticsearch、Logstash、Kibana和Filebeat。elastic提供的一整套组件可以看作为MVC模型,logstash对应逻辑控制controller层,Elasticsearch是一个数据模型model层,而Kibana则是视图view层。logstash和Elasticsearch基于Java编写实现,Kibana则使用的是框架。

下面依次介绍这几个组件的功能,以及在日志采集系统中的作用。

三、Elasticsearch的安装与使用

Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVAAPI等结构提供高效搜索功能,可扩展的分布式系统。它构建于ApacheLucene搜索引擎库之上。

Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户,能胜任上百个服务节点的扩展,并支持PB级别的结构化或者非结构化数据。

Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。

Elasticsearch是一个实时的分布式搜索分析引擎,它被用作全文检索、结构化搜索、分析以及这三个功能的组合,它是面向文档的,意味着它存储整个对象或文档。Elasticsearch不仅存储文档,而且索引每个文档的内容使之可以被检索。在Elasticsearch中,你对文档进行索引、检索、排序和过滤--而不是对行列数据。

为了方便,我们直接使用使用docker安装Elasticsearch:

$/elasticsearch/elasticsearch:5.4.0

需要注意的是,Elasticsearch启动之后需要进行简单的设置,默认是开启的,为了方便,取消登录认证。我们登入到容器内部,执行如下的命令:

编辑配置文件$vimconfig/:"docker-cluster":0.0.0.0::"*":falsesetto1toallowsinglenodeclusterscurl'http://localhost:9200/_nodes/http?pretty'{"_nodes":{"total":1,"successful":1,"failed":0},"cluster_name":"docker-cluster","nodes":{"8iH5v9C-Q9GA3aSupm4caw":{"name":"8iH5v9C","transport_address":"10.0.1.14:9300","host":"10.0.1.14","ip":"10.0.1.14","version":"5.4.0","build_hash":"780f8c4","roles":["master","data","ingest"],"attributes":{"":"true"},"http":{"bound_address":["[::]:9200"],"publish_address":"10.0.1.14:9200","max_content_length_in_bytes":104857600}}}}

可以看到,我们成功安装了Elasticsearch,Elasticsearch作为日志数据信息的存储源,为我们提供了高效的搜索性能。

我们另外还安装了Elasticsearch的可视化工具:elasticsearch-head。安装方法很简答:

$dockerrun-p9100:9100mobz/elasticsearch-head:5

elasticsearch-head用于监控Elasticsearch状态的客户端插件,包括数据可视化、执行增删改查操作等。

安装之后的界面如下所示:

四、logstash的安装与使用

logstash是一个数据分析软件,主要目的是分析log日志。其使用的原理如下所示:

数据源首先将数据传给logstash,我们这里使用的是Filebeat传输日志数据。它主要的组成部分有Input数据输入、Filter数据源过滤和Output数据输出三部分。

logstash将数据进行过滤和格式化(转成JSON格式),然后发送到Elasticsearch进行存储,并建搜索的索引,Kibana提供前端的页面视图,可以在页面进行搜索,使得结果变成图表可视化。

下面我们开始安装使用logstash。首先下载解压logstash:

/{beats{port=5044codec="json"}}output{elasticsearch{hosts=["127.0.0.1:9200"]index="logstash-app-error-%{+}"}stdout{codec=rubydebug}}

输入支持文件、syslog、beats,我们在配置时只能选择其中一种。这里我们配置了filebeats方式。

过滤则用于处理一些特定的行为来,处理匹配特定规则的事件流。常见的filters有grok解析无规则的文字并转化为有结构的格式、geoip添加地理信息、drop丢弃部分事件和mutate修改文档等。如下是一个filter使用的示例:

filter{URI::HTTP:0x1abac0URL:;}[2020-10-30T14:12:26,225][INFO][]Usingmappingtemplatefrom{:path=nil}[2020-10-30T14:12:26,288][INFO][]Attemptingtoinstalltemplate{:manage_template={"template"="logstash-*","version"=50001,"settings"={"_interval"="5s"},"mappings"={"_default_"={"_all"={"enabled"=true,"norms"=false},"dynamic_templates"=[{"message_field"={"path_match"="message","match_mapping_type"="string","mapping"={"type"="text","norms"=false}}},{"string_fields"={"match"="*","match_mapping_type"="string","mapping"={"type"="text","norms"=false,"fields"={"keyword"={"type"="keyword"}}}}}],"properties"={"@timestamp"={"type"="date","include_in_all"=false},"@version"={"type"="keyword","include_in_all"=false},"geoip"={"dynamic"=true,"properties"={"ip"={"type"="ip"},"location"={"type"="geo_point"},"latitude"={"type"="half_float"},"longitude"={"type"="half_float"}}}}}}}}[2020-10-30T14:12:26,304][INFO][]NewElasticsearchoutput{:class="LogStash::Outputs::ElasticSearch",:hosts=[下载filebeat$wget$_64.$_64filebeat配置filebeat$vifilebeat/:-input_type:logpaths:-/var/log/*.:hosts:["localhost:5044"]

在filebeat的配置中,input_type支持从Log、Syslog、Stdin、Redis、UDP、Docker、TCP、NetFlow输入。上述配置了从log中读取日志信息。并且配置了只输入/var/log/目录下的日志文件。output将Filebeat配置为使用logstash,并且使用logstash对Filebeat收集的数据执行额外的处理。

配置好之后,我们启动Filebeat:

$.//10/3006:46:31.764391:285:INFOHomepath:[/elk/filebeat]Configpath:[/elk/filebeat]Datapath:[/elk/filebeat/data]Logspath:[/elk/filebeat/logs]2020/10/3006:46:31.764426:186:INFOSetupBeat:filebeat;Version:5.4.32020/10/3006:46:31.764522:90:INFOMaxRetriessetto:32020/10/3006:46:31.764588:108:/10/3006:46:31.764586:23:INFOMetricsloggingevery30s2020/10/3006:46:31.764664:295:INFOPublishername:VM_1_14_centos2020/10/3006:46:31.765299:63:INFOFlushIntervalsetto:1s2020/10/3006:46:31.765315:64:INFOMaxBulkSizesetto:20482020/10/3006:46:31.765563:221:/10/3006:46:31.765592:85:INFORegistryfilesetto:/elk/filebeat/data/registry2020/10/3006:46:31.765630:106:INFOLoadingregistrardatafrom/elk/filebeat/data/registry2020/10/3006:46:31.766100:123:INFOStatesLoadedfromregistrar:62020/10/3006:46:31.766136:38:INFOLoadingProspectors:12020/10/3006:46:31.766209:236:INFOStartingRegistrar2020/10/3006:46:31.766256:41:INFOStartsingeventstooutput2020/10/3006:46:31.766291prospector_:65:INFOProspectorwithpreviousstatesloaded:02020/10/3006:46:31.766390:124:INFOStartingprospectoroftype:log;id:253672992020/10/3006:46:31.766422:58::12020/10/3006:46:31.766430:63:INFOStartingspooler:spool_size:2048;idle_timeout:5s2020/10/3006:47:01.764888:34:INFONonon-zerometricsinthelast30s2020/10/3006:47:31.764929:34:INFONonon-zerometricsinthelast30s2020/10/3006:48:01.765134:34:INFONonon-zerometricsinthelast30s

启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。

七、ELKB的使用实践

安装好ELKB组件之后,我们开始整合这些组件。首先看下ELKB收集日志的流程。

Filebeat监听应用的日志文件,随后将数据发送给logstash,logstash则对数据进行过滤和格式化,如JSON格式化;之后logstash将处理好的日志数据发送给Elasticsearch,Elasticsearch存储并建立搜索的索引;Kibana提供可视化的视图页面。

我们运行所有的组件之后,首先看下elasticsearch-head中的索引变化:

可以看到多了一个的索引,说明ELKB分布式日志收集框架搭建成功。访问http://localhost:9100,我们来具体看下索引的数据:

从上面两幅截图可以看到,/var/log/目录下的文件中产生了新的日志数据,这些数据非常多,我们在生产环境需要根据实际的业务进行过滤,并处理相应的日志格式。

elasticsearch-head是一个简单的Elasticsearch客户端,更加完整的统计和搜索需求,需要借助于Kibana,Kibana提升了Elasticsearch分析能力,能够更加智能地分析数据,执行数学转换并且根据要求对数据切割分块。

访问http://localhost:5601,得到了上图中的日志信息。Filebeat监听到了mysql日志,并在Kibana上展示。Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图,这里就不一一展示了。

八、小结

本文主要介绍了分布式日志采集系统ELKB。日志主要用来记录离散的事件,包含程序执行到某一点或某一阶段的详细信息。ELKB很好地解决了微服务架构下,服务实例众多且分散,日志难以收集和分析的问题。限于篇幅,本课时只介绍了ELKB的安装使用,Go微服务中一般使用日志框架如logrus、zap等,按照一定的格式将日志输出到指定的位置,读者可以自行构建一个微服务进行实践。

很赞哦!(196)