Kratos微服务轻松对接EFK日志系统

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: EFK 是一个完整的分布式日志收集系统,很好地解决了上述提到的日志收集难,检索和分析难的问题。EFK=Elasticsearch+Fluentd+Kibana

Kratos微服务轻松对接EFK日志系统

在早期的单体服务时代,如果想要在生产环境中通过日志去定位业务逻辑的Bug或者性能问题,那么我们需要让运维人员逐个远程登入服务器,逐个服务实例去查询日志文件,这样排查问题的效率是相当的低,当线上发生了紧急状况的时候,人都要急死,却又无法有效率的排查出问题所在,更不用说解决问题。

而在微服务时代,服务实例部署在不同的物理机上,各个微服务的日志也被分散储存在不同的物理机上。当服务集群足够大,成百上千,甚至上万,此时再使用上述的传统方式查阅日志,那已经是不可完成的任务。因此,我们需要集中化管理分布式系统中的日志,其中有开源的组件如Syslog,用于将所有服务器上的所有服务的日志进行收集、汇总。

日志收集是微服务可观测性中不可或缺的一部分。日志对于调试问题和监视集群状况非常有用。

然而,集中化收集日志文件之后,并非就万事大吉了,我们还有一系列的问题需要解决:如何对日志文件进行分析和查询。哪些服务有报警和异常,这些也都需要有详细的统计。所以,以前出现线上故障时,经常会看到开发和运维人员下载服务的日志,并基于 Linux 下的一些命令(如 grep、awk 和 wc 等)进行检索和统计。这样的方式不仅工作量大,并且效率低下,而且对于要求更高的查询、排序和统计等操作,以及庞大的集群机器数量,无法胜任。

EFK(ElasticsearchFluentdKibana)是当下微服务中比较流行的分布式日志服务解决方案。以下,我们将就EFK应用于Kratos微服务,逐步展开讲解。

EFK 分布式日志系统

EFK 是一个完整的分布式日志收集系统,很好地解决了上述提到的日志收集难,检索和分析难的问题。

EFK 分别是指:

  • Elasticsearch 是一个分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。
  • Fluentd 是一个开源的数据收集器,我们可以在微服务集群节点上安装 Fluentd,通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。Fluentd的日志必须以JSON为载体,日志内容没有限制。
  • Kibana 是一个可视化化平台。Kibana 用于搜索、分析和可视化存储在 Elasticsearch 指标中的日志数据,是一个 Web 网页。Kibana 利用 Elasticsearch 的 REST 接口来检索数据,调用 Elasticsearch 存储的数据,将其可视化。它不仅允许用户自定义视图,还支持以特殊的方式查询和过滤数据。

如果,我们将这一系列组件视为 MVC 模型,那么就是:

  • Fluentd 对应逻辑控制 Controller 层
  • Elasticsearch 是一个数据模型 Model 层,
  • Kibana 则是视图 View 层。

Elasticsearch 基于 Java 编写实现,Kibana 使用的是 node.js 框架,Fluentd 使用Ruby语言编写。

部署EFK

我们使用Docker来部署EFK,首先,让我们先编写一个Docker-Compose的配置文件:

version: '3'

networks:
  app-tier:
    driver: bridge

services:
  elasticsearch:
    image: docker.io/bitnami/elasticsearch:latest
    networks:
      - app-tier
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=elastic
      - xpack.security.enabled=true
      - discovery.type=single-node
      - http.cors.enabled=true
      - http.cors.allow-origin=http://localhost:13580,http://127.0.0.1:13580
      - http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
      - http.cors.allow-credentials=true

  fluentd:
    image: docker.io/bitnami/fluentd:latest
    networks:
      - app-tier
    depends_on:
      - "elasticsearch"
    volumes:
      - /data/fluentd/conf:/opt/bitnami/fluentd/conf
      - /data/fluentd/log:/opt/bitnami/fluentd/log
    ports:
      - "24224:24224"
      - "24224:24224/udp"

  kibana:
    image: docker.io/bitnami/kibana:latest
    networks:
      - app-tier
    depends_on:
      - "elasticsearch"
    ports:
      - "5601:5601"
    environment:
      - KIBANA_ELASTICSEARCH_URL=elasticsearch
      - KIBANA_ELASTICSEARCH_PORT_NUMBER=9200

然后,我们使用以下命令来创建Docker容器,并且在后台运行:

docker-compose up -d

这还不算完,我们还需要修改Fluentd的配置,原始的配置,日志只记录在Fluentd本地的文本文件里面。我们需要修改配置,以使之能够将日志输入到ElasticSearch。

原始的配置文件如下所示:

<source>
  @type  forward
  @id    input1
  @label @mainstream
  port  24224
</source>

<filter **>
  @type stdout
</filter>

<label @mainstream>
  <match docker.**>
    @type file
    @id   output_docker1
    path         /opt/bitnami/fluentd/logs/docker.*.log
    symlink_path /opt/bitnami/fluentd/logs/docker.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   1m
    time_format       %Y%m%dT%H%M%S%z
  </match>
  <match **>
    @type file
    @id   output1
    path         /opt/bitnami/fluentd/logs/data.*.log
    symlink_path /opt/bitnami/fluentd/logs/data.log
    append       true
    time_slice_format %Y%m%d
    time_slice_wait   10m
    time_format       %Y%m%dT%H%M%S%z
  </match>
</label>

# Include config files in the ./config.d directory
@include config.d/*.conf

我们需要将<match **>节点修改为如下配置:

<match **>
  @type elasticsearch
  host host.docker.internal
  port 9200
  index_name fluentd
  type_name log
</match>

上述配置,实际上是利用了fluent-plugin-elasticsearch插件,将日志导入到ElasticSearch。

Kratos微服务对接EFK

首先,我们需要下载Fluent的一个封装:

go get github.com/go-kratos/kratos/contrib/log/fluent/v2

然后创建日志记录器:

fluentLogger "github.com/go-kratos/kratos/contrib/log/fluent/v2"

// NewFluentLogger 创建一个日志记录器 - Fluent
func NewFluentLogger(endpoint string) log.Logger {
   
   
    wrapped, err := fluentLogger.NewLogger(endpoint)
    if err != nil {
   
   
        panic("create fluent logger failed")
        return nil
    }
    return wrapped
}

现在,所有Kratos的日志就都注入到了EFK当中去了。

Kibana查询日志

Kibana的访问端口是5601,因此我们可以访问:http://127.0.0.1:5601/

当我们第一次进入Kibana,一片空白,什么都没有。那么,我们需要添加Data View,相当于创建了一个日志的查询视图。

我们点击:Discover -> Create a data view,之后,我们将看到如下的界面:

kibana_create_data_view

在上面,我们在fluent里面设置了elasticsearch的索引为:fluent,所以,我们在Index pattern里面填写fluent,即可。Timestamp field我们可以从下拉框里面找到ts,选中即可。然后,我们就可以点击Save data view to Kibana创建视图了。

我们将看到日志查询的视图:

kibana_query_log

在视图里面,我们看到的还只是最原始的日志信息。我们可以在左边勾选msg或者其他需要关注的字段,Kibana就会过滤出我们关注的信息:

kibana_query_log

如果需要构建更加复杂的查询,那么可以在最上面的搜索栏里边构建查询语句。

参考资料

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
Java 应用服务中间件 nginx
微服务框架(二十九)Logstash Nginx 日志上报
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Logstash Nginx 日志上报 本系列文章中所使用的框架版本为Spring Boot 2.0.3...
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架(三十)Logstash Kong 日志上报
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Logstash Kong 日志上报 本系列文章中所使用的框架版本为Spring Boot 2.0.3-...
|
3月前
|
JSON Java 数据格式
微服务框架(十三)Spring Boot Logstash日志采集
  本文为Spring Boot中Log4j2对接Logstash,进行日志采集。Logstah只支持log4j,使用log4j2时需要通过TCP插件调用 此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。
|
5月前
|
Java Docker 索引
微服务轮子项目(13) - 统一日志中心详解(docker安装部署)
微服务轮子项目(13) - 统一日志中心详解(docker安装部署)
84 0
|
5月前
|
canal 消息中间件 关系型数据库
微服务轮子项目(36) -Canal数据库日志解析消费
微服务轮子项目(36) -Canal数据库日志解析消费
62 0
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架(八)Spring Boot AOP 日志切面实现
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为使用Spring Boot AOP 实现日志切面、分离INFO和ERROR级别日志
|
4月前
|
存储 JSON API
微服务框架 go-zero logx 日志组件剖析
微服务框架 go-zero logx 日志组件剖析
|
5月前
|
缓存 Java API
微服务轮子项目(38) -分布式日志链路跟踪
微服务轮子项目(38) -分布式日志链路跟踪
73 0
|
5月前
|
SQL 关系型数据库 MySQL
微服务轮子项目(15) -审计日志
微服务轮子项目(15) -审计日志
47 0
|
5月前
|
消息中间件 存储 Kafka
微服务轮子项目(07) - 日志解决方案设计
微服务轮子项目(07) - 日志解决方案设计
50 0