微服务下,使⽤ELK进⾏⽇志采集以及统⼀处理
摘要:微服务各个组件的相关实践会涉及到⼯具,本⽂将会介绍微服务⽇常开发的⼀些利器,这些⼯具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。
微服务各个组件的相关实践会涉及到⼯具,本⽂将会介绍微服务⽇常开发的⼀些利器,这些⼯具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。
我们将重点介绍微服务架构中的⽇志收集⽅案 ELK(ELK 是 Elasticsearch、Logstash、Kibana 的简称),准确的说是 ELKB,即 ELK + Filebeat,其中 Filebeat 是⽤于转发和集中⽇志数据的轻量级传送⼯具。
为什么需要分布式⽇志系统log4j与log4j2
在以前的项⽬中,如果想要在⽣产环境需要通过⽇志定位业务服务的 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 则使⽤的是 node.js 框架。
下⾯依次介绍这⼏个组件的功能,以及在⽇志采集系统中的作⽤。
Elasticsearch 的安装与使⽤
Elasticsearch 是实时全⽂搜索和分析引擎,提供搜集、分析、存储数据三⼤功能;是⼀套开放 REST 和 JAVA API 等结构提供⾼效搜索功能,可扩展的分布式系统。它构建于Apache Lucene 搜索引擎库之上。
Elasticsearch可以⽤于搜索各种⽂档。它提供可扩展的搜索,具有接近实时的搜索,并⽀持多租户,能胜任上百个服务节点的扩展,并⽀持 PB 级别的结构化或者⾮结构化数据。
Elasticsearch是分布式的,这意味着索引可以被分成分⽚,每个分⽚可以有0个或多个副本。每个节点托管⼀个或多个分⽚,并充当协调器将操作委托给正确的分⽚。再平衡和路由是⾃动完成的。相关数据通常存储在同⼀个索引中,该索引由⼀个或多个主分⽚和零个或多个复制分⽚组成。⼀旦创建了索引,就不能更改主分⽚的数量。Elasticsearch 是⼀个实时的分布式搜索分析引擎,它被⽤作全⽂检索、结构化搜索、分析以及这三个功能的组合,它是⾯向⽂档的,意味着它存储整个对象或⽂档。Elasticsearch 不仅存储⽂档,⽽且索引每个⽂档的内容使之可以被检索。在 Elasticsearch 中,你对⽂档进⾏索引、检索、排序和过滤--⽽不是对⾏列数据。
为了⽅便,我们直接使⽤使⽤ docker 安装 Elasticsearch:
$ docker run  -d --name elasticsearch  /elasticsearch/elasticsearch:5.4.0
需要注意的是,Elasticsearch 启动之后需要进⾏简单的设置,abled 默认是开启的,为了⽅便,取消登录认证。我们登⼊到容器内部,执⾏如下的命令:
# 进⼊启动好的容器
$ docker exec -it elasticsearch bash
# 编辑配置⽂件
$ vim l
cluster.name: "docker-cluster"
network.host: 0.0.0.0
abled: false
# minimum_master_nodes need to be explicitly set when bound on a public IP
# set to 1 to allow single node clusters
# Details: github/elastic/elasticsearch/pull/17288
修改好配置⽂件之后,退出容器,重启容器即可。我们为了后⾯使⽤时能够保留配置,需要从该容器创建⼀个新的镜像。⾸先获取到该容器对应的 ContainerId。然后基于该容器提交成⼀个新的镜像。
$ docker commit -a "add config" -m "dev" a404c6c174a2  es:latest
sha256:5cb8c995ca819765323e76cccea8f55b423a6fa2eecd9c1048b2787818c1a994
这样我们得到了⼀个新的镜像 es:latest。我们运⾏新的镜像:
docker run -d --name es -p 9200:9200 -p 9300:9300  -e "pe=single-node" es:latest
通过访问 Elasticsearch 提供的内置端点,我们检查是否安装成功。
[root@VM_1_14_centos ~]# curl '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" : {
"ml.enabled" : "true"
},
"http" : {
"bound_address" : [
"[::]:9200"
],
"publish_address" : "10.0.1.14:9200",
"max_content_length_in_bytes" : 104857600
}
}
}
}
可以看到,我们成功安装了 Elasticsearch,Elasticsearch 作为⽇志数据信息的存储源,为我们提供了⾼效的搜索性能。
我们另外还安装了 Elasticsearch 的可视化⼯具:elasticsearch-head。安装⽅法很简答:
$ docker run -p 9100:9100 mobz/elasticsearch-head:5
elasticsearch-head ⽤于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执⾏增删改查操作等。
安装之后的界⾯如下所⽰:
logstash 的安装与使⽤
logstash 是⼀个数据分析软件,主要⽬的是分析 log ⽇志。其使⽤的原理如下所⽰:
数据源⾸先将数据传给 logstash,我们这⾥使⽤的是 Filebeat 传输⽇志数据。它主要的组成部分有 Input 数据输⼊、Filter 数据源过滤和 Output 数据输出三部分。
logstash 将数据进⾏过滤和格式化(转成 JSON 格式),然后发送到 Elasticsearch 进⾏存储,并建搜索的索引,Kibana 提供前端的页⾯视图,可以在页⾯进⾏搜索,使得结果
变成图表可视化。
下⾯我们开始安装使⽤ logstash。⾸先下载解压 logstash:
# 下载 logstash
$ wget /downloads/logstash/logstash-5.4.
# 解压 logstash
$ tar -zxvf logstash-5.4.
下载速度可能⽐较慢,可以选择国内的镜像源。解压成功之后,我们需要配置 logstash,主要就是我们所提到的输⼊、输出和过滤。
[root@VM_1_14_centos elk]# cat logstash-5.4.f
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-app-error-%{+YYYY.MM.dd}"
}
stdout {codec => rubydebug}
}
输⼊⽀持⽂件、syslog、beats,我们在配置时只能选择其中⼀种。这⾥我们配置了 filebeats ⽅式。
过滤则⽤于处理⼀些特定的⾏为来,处理匹配特定规则的事件流。常见的 filters 有 grok 解析⽆规则的⽂字并转化为有结构的格式、 geoip 添加地理信息、drop 丢弃部分事件和
mutate 修改⽂档等。如下是⼀个 filter 使⽤的⽰例:
filter {
#定义客户端的 IP 是哪个字段
geoip {
source => "clientIp"
}
}
输出⽀持 Elasticsearch、file、graphite 和 statsd,默认情况下将过滤扣的数据输出到 Elasticsearch,当我们不需要输出到ES时需要特别声明输出的⽅式是哪⼀种,同时⽀持配
置多个输出源。
⼀个 event 可以在处理过程中经过多重输出,但是⼀旦所有的 outputs 都执⾏结束,这个 event 也就完成⽣命周期。
我们在配置中,将⽇志信息输出到 Elasticsearch。配置⽂件搞定之后,我们开始启动 logstash:
$ bin/logstash  -f
Sending Logstash's logs to /elk/logstash-5.4.3/logs which is now configured via log4j2.properties
[2020-10-30T14:12:26,056][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[127.0.0.1:9200/]}}
[2020-10-30T14:12:26,062][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>127.0.0.1:9200/, :path=>"/"}
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See /log4j/1.2/faq.html#noconfig for more info.
[2020-10-30T14:12:26,209][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>#<URI::HTTP:0x1abac0 URL:127.0.0.1:9200/>}[2020-10-30T14:12:26,225][INFO ][logstash.outputs.elasticsearch] Using mappin [2020-10-30T14:12:26,288][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "settings"=>{"fresh_interval"=>"5s"}, "mappings"
=>{"_default_
[2020-10-30T14:12:26,304][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>[#<URI::Generic:0x2fec3fe6 URL://127.0.0.1:9200>]}
[2020-10-30T14:12:26,312][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[2020-10-30T14:12:27,226][INFO ][logstash.inputs.beats    ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
[2020-10-30T14:12:27,319][INFO ][logstash.pipeline        ] Pipeline main started
[2020-10-30T14:12:27,422][INFO ][logstash.agent          ] Successfully started Logstash API endpoint {:port=>9600}
根据控制台输出的⽇志,我们知道 logstash 已经正常启动。
Kibana 的安装与使⽤
Kibana 是⼀个基于 Web 的图形界⾯,⽤于搜索、分析和可视化存储在 Elasticsearch 指标中的⽇志数据。Kibana 调⽤ Elasticsearch 的接⼝返回的数据进⾏可视化。它利⽤
Elasticsearch 的 REST 接⼝来检索数据,不仅允许⽤户创建他们⾃⼰的数据的定制仪表板视图,还允许他们以特殊的⽅式查询和过滤数据。
Kibana 的安装⽐较简单,我们基于 docker 安装即可:
docker run --name kibana -e ELASTICSEARCH_URL=127.0.0.1:9200 -p 5601:5601 -d kibana:5.6.9
我们在启动命令中指定了 ELASTICSEARCH 的环境变量,就是本地的 127.0.0.1:9200。
Filebeat 的安装与使⽤
Filebeat ⽤于转发和集中⽇志数据的轻量级传送⼯具。Filebeat 监视指定的⽇志⽂件或位置,收集⽇志事件,并将它们转发到 Logstash、Kafka、Redis 等,或直接转发到
Elasticsearch 进⾏索引。
下⾯我们开始安装配置 Filebeat:
# 下载 filebeat
$ wget /downloads/beats/filebeat/filebeat-5.4.3-linux-x86_
$ tar -zxvf filebeat-5.4.3-linux-x86_
$ mv filebeat-5.4.3-linux-x86_64 filebeat
# 进⼊⽬录
$ cd filebeat
# 配置 filebeat
$ vi l
filebeat.prospectors:
- input_type: log
paths:
-
/var/log/*.log
output.logstash:
hosts: ["localhost:5044"]
在 filebeat 的配置中,input_type ⽀持从Log、Syslog、Stdin、Redis、UDP、Docker、TCP、NetFlow 输⼊。上述配置了从 log 中读取⽇志信息。并且配置了只输⼊ /var/log/⽬录下的⽇志⽂件。output 将 Filebeat 配置为使⽤ logstash,并且使⽤ logstash 对 Filebeat 收集的数据执⾏额外的处理。
配置好之后,我们启动 Filebeat:
$ ./filebeat  -e  -l
2020/10/3006:46:31.:285: INFO Home path: [/elk/filebeat] Config path: [/elk/filebeat] Data path: [/elk/filebeat/data] Logs path: [/elk/filebeat/logs]
2020/10/3006:46:31.:186: INFO Setup Beat: filebeat; Version: 5.4.3
2020/10/3006:46:31.:90: INFO Max Retries set to: 3
2020/10/3006:46:31.:108: INFO Activated logstash as output plugin.
2020/10/3006:46:31.:23: INFO Metrics logging every 30s
2020/10/3006:46:31.:295: INFO Publisher name: VM_1_14_centos
2020/10/3006:46::63: INFO Flush Interval set to: 1s
2020/10/3006:46::64: INFO Max Bulk Size set to: 2048
2020/10/3006:46:31.:221: INFO filebeat start running.
2020/10/3006:46:31.:85: INFO Registry file set to: /elk/filebeat/data/registry
2020/10/3006:46:31.:106: INFO Loading registrar data from /elk/filebeat/data/registry
2020/10/3006:46:31.:123: INFO States Loaded from registrar: 6
2020/10/3006:46:31.:38: INFO Loading Prospectors: 1
2020/10/3006:46:31.:236: INFO Starting Registrar
2020/10/3006:46:31.:41: INFO Start sending events to output
2020/10/3006:46:31.766291 :65: INFO Prospector with previous states loaded: 0
2020/10/3006:46:31.:124: INFO Starting prospector of type: log; id: 2536729917787673381
2020/10/3006:46:31.:58: INFO Loading and starting Prospectors completed. Enabled prospectors: 1
2020/10/3006:46:31.:63: INFO Starting spooler: spool_size: 2048; idle_timeout: 5s
2020/10/3006:47:01.:34: INFO No non-zero metrics in the last 30s
2020/10/3006:47:31.:34: INFO No non-zero metrics in the last 30s
2020/10/3006:48:01.:34: INFO No non-zero metrics in the last 30s
启动 Filebeat 时,它将启动⼀个或多个输⼊,这些输⼊将在为⽇志数据指定的位置中查。对于 Filebeat 所到的每个⽇志,Filebeat 都会启动收集器。每个收集器都读取单个⽇志以获取新内容,并将新⽇志数据发送到 libbeat,libbeat 将聚集事件,并将聚集的数据发送到为 Filebeat 配置的输出。
ELKB 的使⽤实践
安装好 ELKB 组件之后,我们开始整合这些组件。⾸先看下 ELKB 收集⽇志的流程。
Filebeat 监听应⽤的⽇志⽂件,随后将数据发送给 logstash,logstash 则对数据进⾏过滤和格式化,如 JSON 格式化;之后 logstash 将处理好的⽇志数据发送给Elasticsearch,Elasticsearch 存储并建⽴搜索的索引;Kibana 提供可视化的视图页⾯。
我们运⾏所有的组件之后,⾸先看下 elasticsearch-head 中的索引变化:
从上⾯两幅截图可以看到,/var/log/ ⽬录下的 mysqld.log ⽂件中产⽣了新的⽇志数据,这些数据⾮常多,我们在⽣产环境需要根据实际的业务进⾏过滤,并处理相应的⽇志格式。
elasticsearch-head 是⼀个简单的 Elasticsearch 客户端,更加完整的统计和搜索需求,需要借助于 Kibana,Kibana 提升了 Elasticsearch 分析能⼒,能够更加智能地分析数据,执⾏数学转换并且根据要求对数据切割分块。
⼩结
本⽂主要介绍了分布式⽇志采集系统 ELKB。⽇志主要⽤来记录离散的事件,包含程序执⾏到某⼀点或
某⼀阶段的详细信息。ELKB 很好地解决了微服务架构下,服务实例众多且分散,⽇志难以收集和分析的问题。限于篇幅,本课时只介绍了 ELKB 的安装使⽤,Go 微服务中⼀般使⽤⽇志框架如 logrus、zap 等,按照⼀定的格式将⽇志输出到指定的位置,读者可以⾃⾏构建⼀个微服务进⾏实践。
本⽂分享⾃华为云社区《【华为云专家原创】微服务架构中使⽤ ELK 进⾏⽇志采集以及统⼀处理》,原⽂作者:。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。