百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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

liuian 2025-06-24 15:17 79 浏览

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

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

我们将重点介绍微服务架构中的日志收集方案 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 则使用的是 node.js 框架。

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

三、Elasticsearch 的安装与使用

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

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

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

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

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

$ docker run   -d --name elasticsearch  docker.elastic.co/elasticsearch/elasticsearch:5.4.0

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

# 进入启动好的容器
$ docker exec -it elasticsearch bash

# 编辑配置文件
$ vim config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true

http.cors.allow-origin: "*"
xpack.security.enabled: false

# minimum_master_nodes need to be explicitly set when bound on a public IP
# set to 1 to allow single node clusters
# Details: https://github.com/elastic/elasticsearch/pull/17288
discovery.zen.minimum_master_nodes: 1

修改好配置文件之后,退出容器,重启容器即可。我们为了后面使用时能够保留配置,需要从该容器创建一个新的镜像。首先获取到该容器对应的 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 "discovery.type=single-node" es:latest

通过访问 Elasticsearch 提供的内置端点,我们检查是否安装成功。

[root@VM_1_14_centos ~]# curl '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" : {
        "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 https://artifacts.elastic.co/downloads/logstash/logstash-5.4.3.tar.gz
# 解压 logstash
$ tar -zxvf logstash-5.4.3.tar.gz

下载速度可能比较慢,可以选择国内的镜像源。解压成功之后,我们需要配置 logstash,主要就是我们所提到的输入、输出和过滤。

[root@VM_1_14_centos elk]# cat logstash-5.4.3/client.conf
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 client.conf
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=>[http://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=>http://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 http://logging.apache.org/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:http://127.0.0.1:9200/>}[2020-10-30T14:12:26,225][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
[2020-10-30T14:12:26,288][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "settings"=>{"index.refresh_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 ][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=http://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 https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.3-linux-x86_64.tar.gz
$ tar -zxvf filebeat-5.4.3-linux-x86_64.tar.gz
$ mv filebeat-5.4.3-linux-x86_64 filebeat
# 进入目录
$ cd filebeat

# 配置 filebeat
$ vi filebeat/client.yml
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  -c client.yml
2020/10/30 06:46:31.764391 beat.go:285: INFO Home path: [/elk/filebeat] Config path: [/elk/filebeat] Data path: [/elk/filebeat/data] Logs path: [/elk/filebeat/logs]
2020/10/30 06:46:31.764426 beat.go:186: INFO Setup Beat: filebeat; Version: 5.4.3
2020/10/30 06:46:31.764522 logstash.go:90: INFO Max Retries set to: 3
2020/10/30 06:46:31.764588 outputs.go:108: INFO Activated logstash as output plugin.
2020/10/30 06:46:31.764586 metrics.go:23: INFO Metrics logging every 30s
2020/10/30 06:46:31.764664 publish.go:295: INFO Publisher name: VM_1_14_centos
2020/10/30 06:46:31.765299 async.go:63: INFO Flush Interval set to: 1s
2020/10/30 06:46:31.765315 async.go:64: INFO Max Bulk Size set to: 2048
2020/10/30 06:46:31.765563 beat.go:221: INFO filebeat start running.
2020/10/30 06:46:31.765592 registrar.go:85: INFO Registry file set to: /elk/filebeat/data/registry
2020/10/30 06:46:31.765630 registrar.go:106: INFO Loading registrar data from /elk/filebeat/data/registry
2020/10/30 06:46:31.766100 registrar.go:123: INFO States Loaded from registrar: 6
2020/10/30 06:46:31.766136 crawler.go:38: INFO Loading Prospectors: 1
2020/10/30 06:46:31.766209 registrar.go:236: INFO Starting Registrar
2020/10/30 06:46:31.766256 sync.go:41: INFO Start sending events to output
2020/10/30 06:46:31.766291 prospector_log.go:65: INFO Prospector with previous states loaded: 0
2020/10/30 06:46:31.766390 prospector.go:124: INFO Starting prospector of type: log; id: 2536729917787673381
2020/10/30 06:46:31.766422 crawler.go:58: INFO Loading and starting Prospectors completed. Enabled prospectors: 1
2020/10/30 06:46:31.766430 spooler.go:63: INFO Starting spooler: spool_size: 2048; idle_timeout: 5s

2020/10/30 06:47:01.764888 metrics.go:34: INFO No non-zero metrics in the last 30s
2020/10/30 06:47:31.764929 metrics.go:34: INFO No non-zero metrics in the last 30s
2020/10/30 06:48:01.765134 metrics.go: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 中的索引变化:

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


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

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

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

八、小结

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

相关推荐

驱动网卡(怎么从新驱动网卡)
驱动网卡(怎么从新驱动网卡)

网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...

2026-01-30 00:37 liuian

win10更新助手装系统(微软win10更新助手)

1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...

windows11专业版密钥最新(windows11专业版激活码永久)

 Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...

手机删过的软件恢复(手机删除过的软件怎么恢复)
手机删过的软件恢复(手机删除过的软件怎么恢复)

操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...

2026-01-29 23:55 liuian

一键ghost手动备份系统步骤(一键ghost 备份)

  步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。  步骤...

怎么创建局域网(怎么创建局域网打游戏)

  1、购买路由器一台。进入路由器把dhcp功能打开  2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。  3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...

精灵驱动器官方下载(精灵驱动手机版下载)

是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...

一键还原系统步骤(一键还原系统有哪些)

1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。  2、在弹出的“准备安装”窗口中,可...

电脑加速器哪个好(电脑加速器哪款好)

我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...

任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)

是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...

u盘怎么恢复文件(u盘文件恢复的方法)

开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...

系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)

1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...

剪贴板权限设置方法(剪贴板访问权限)
剪贴板权限设置方法(剪贴板访问权限)

1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...

2026-01-29 21:37 liuian

平板系统重装大师(平板重装win系统)

如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...

联想官网售后服务网点(联想官网售后服务热线)

联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...