前言

在微服务架构中服务众多,每个微服务都会产生大量的日志数据,服务的调用错综复杂,如何才能快速定位到BUG?所以日志收集是微服务项目不可或缺的。为了方便日志分析,我们需要对微服务的日志数据进行存储,同时提供一个友好的可视化界面方便分析。存储到文件和数据库都不太合适因为数据量太大,也不好查阅。ELK是一个较为成熟的分布式日志解决方案。

什么是ELK

ELK不是一个框架,而是包含三款产品的组合:Elasticsearch、Logstash、Kibana : 下面是对这三个技术的解释
在这里插入图片描述

  • Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
  • logstash是一种分布式日志收集框架,开发语言是JRuby,当然是为了与Java平台对接,不过与Ruby语法兼容良好,非常简洁强大,经常与ElasticSearch,Kibana配置,组成著名的ELK技术栈,非常适合用来做日志数据的分析。作为日志收集软件,它可以收集日志到多种存储系统或临时中转系统,如ElasticSearch,MySQL,Redis,Kakfa,HDFS, Lucene,Solr等
  • Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。您使用Kibana搜索,查看和与存储在Elasticsearch索引中的数据进行交互。您可以轻松执行高级数据分析,并在各种图表,表格和地图中可视化您的数据

简单理解就是:我们通过Logstash来收集数据,然后Logstash把数据存储到ElasticSearch中,在使用Kibana可视化工具和ElasticSearch交互,提供友好的界面来方便分析和统计数据。流程如下
在这里插入图片描述

ELK服务器安装

我们采用Docker来安装ELK服务器,所以需要先安装Docker,然后安装ELK

安装Docker

在准备好的linux机器上安装好Docker

# yum源指定
[root@localhost ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
[root@localhost ~]# sudo yum -y install docker-ce
#启动dokcer
[root@localhost ~]# sudo systemctl start docker

使用阿里云镜像加速

[root@localhost ~]# vi /etc/docker/daemon.json
#加入如下内容
{
  "registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"]
}

重启Docker

[root@localhost ~]# systemctl restart docker

安装ELK服务器

这里使用ELK镜像:sebp/elk:6.8.22 ,该镜像中已经包含了ELK所需要的三个组件。

# 下载elk镜像
[root@localhost ~]# docker pull sebp/elk:6.8.22
# 启动ELK容器 ,指定最小内存和最大内存,并映射相关端口
[root@localhost ~]# docker run --name elk --restart always -d -p 5601:5601 -p 9200:9200 -p 5044:5044 -e ES_MIN_MEM=128m -e ES_MAX_MEM=1024m -m 2048M sebp/elk:6.8.22
# 关闭防火墙,我这里使用定时vm虚拟机,如果是云服务器记得开放端口
[root@localhost ~]# systemctl stop firewalld

启动比较慢,需要等几分钟,访问测试:我的linux机器的ip是:192.168.119.129:5601
在这里插入图片描述
我们还需要对容器中的logstash进行配置,对数据输入和输出做配置

# 进入到ELK容器中
[root@localhost ~]# docker exec -it elk /bin/bash
#修改logstash配置
root@79823af789f6:/# vim /etc/logstash/conf.d/02-beats-input.conf

编辑文件 /etc/logstash/conf.d/02-beats-input.conf 删掉已有内容,把下面的内容粘贴进去

input{
    tcp{
        port => 5044
        codec=> json_lines
    }
}
output{
    elasticsearch{
        hosts => ["localhost:9200"]
    }
}

大概含义是:

  • input代表数据输入配置 , logstatsh的开放端口是 5044
  • output代表数据输出配置,输出到elasticsearch, hosts是es的地址localhost:9200

然后退出容器 : exit ,重启ELK容器

[root@localhost ~]# docker restart elk

到这里ELK服务器安装成功,接下来就是微服务把日志收集到ELK服务器了。

微服务集成ELK

接下来就是微服务把日志收集到ELK服务器了,实现原理就是通过logstash来收集logback日志框架打印的日志,然后发送到云服务器ELK中。首先我们需要导入 logstash 整合 logback 的依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.2</version>
</dependency>

然后为微服务添加日志配置文件 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
   		 <!--  logstash服务器地址-->
        <destination>192.168.119.129:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>


    <root  level="info" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="stash"/>
    </root>

</configuration>

到这里配置完毕,启动程序进行访问,程序就会把日志自动发送到 192.168.119.129:5044 服务器中。然后我们可以直接通过kibana可视化工具进行分析。 这里我们点击:discover 创建 index pattern
在这里插入图片描述
按照timestamp 过滤
在这里插入图片描述

然后再次点击Discover 就可以看到日志数据
在这里插入图片描述

到这里文章就结束了,喜欢的话:点赞好评加收藏!!!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐