使用ELK构建微服务的日志平台

superviser000 2019-06-28

1 概述

在微服务架构中,会部署众多的应用,其中有基础应用,比如:网关,服务发现等。同时还有大量的业务应用。所以,如何有效的收集它们的日志,并且方便查询,同时提供友好的可视化展示,对于应对微服务架构的复杂性有很大的帮助。在高复杂度的系统中,对于定位线上问题,日志非常重要。ELK(ElasticSearch+Logstash+Kibana),可以使用说是目前最流行的日志平台构建方案,之所以深受开发者喜爱,主要是因为它解决了大规模系统的日志收集的各种痛点。

2 ELK Stack

ELK(ElasticSearch+Logstash+Kibana),主要包含三个组件:

  • ElasticSearch
  • Logstash
  • Kibana

2.1 ElasticSearch

ElasticSearch是一个开源的分布式的搜索引擎,它主要基于Apache Lucene。在整个ELK Stack中,ElasticSearch是最核心的组件,它存储数据,并且提供了许多灵活而实用的Rest API,所以,上层应用可以根据需要去查询数据,使用数据,分析数据。在日志平台中,所有的日志数据都存储到ElasticSearch中,借助其强大的搜索能力,可以很灵活的查询日志。

2.2 Logstash

Logstash主要用于收集数据,并将数据保存到ElasticSearch中。

Logstash有丰富插件,并且易于扩展,所以,可以使用Logstash收集到数据后,可以做很多处理,最终再将数据输出到ElasticSearch中。在日志平台中,它主要复杂采集应用的日志。

2.3 Kibana

Kibana主要负责读取ElasticSearch中的数据,并进行可视化展示。并且,它还自带Tool,可以方便调用ElasticSearch的Rest API。在日志平台中,我们通过Kibana查看日志。

3 架构

使用ELK构建了一个日志平台架构:

使用ELK构建微服务的日志平台

这是一个最简化版的日志收集架构,很多基于ELK的日志架构是从它演化而来,核心的问题就是日志数据都保存到ElasticSearch中。比如说,可以先将日志收集到Kafka中,然后再由Logstash采集数据输出到ElasticSearch中,引入了Kafka,就给使用数据增加了很多可能性。

4 搭建日志平台

系统:Ubuntu16.06 64

去官网下载ElasticSearch、Logstash、Kibana,注意尽量保持版本一致,此处使用6.0的大版本,为了便于演示,全部ELK程序和Java应用都安装到一台机器上,目录如下:

noone@ubuntu:/opt$ tree -L 1
.
├── elasticsearch-6.0.0
├── gs-spring-boot-0.1.0.jar
├── kibana-6.0.1-linux-x86_64
├── logs
└── logstash-6.0.1

4.1 配置

为了方便管理,使用systemd管理ElasticSearch、Kibana,配置如下:

/etc/systemd/system/elasticsearch.service

[Service]
Environment=ES_HOME=/opt/elasticsearch-6.0.0
Environment=ES_PATH_CONF=/opt/elasticsearch-6.0.0/config
Environment=PID_DIR=/var/run/elasticsearch

WorkingDirectory=/opt/elasticsearch-6.0.0

User=noone
Group=nonone

ExecStart=/opt/elasticsearch-6.0.0/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of processes
LimitNPROC=4096

# Specifies the maximum size of virtual memory
LimitAS=infinity

# Specifies the maximum file size
LimitFSIZE=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Send the signal only to the JVM rather than its control group
KillMode=process

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

/etc/systemd/system/kibana.service

[Unit]
Description=Kibana

[Service]
Type=simple
User=noone
Environment=CONFIG_PATH=/opt/kibana-6.0.1-linux-x86_64/config/kibana.yml
Environment=NODE_ENV=dev
ExecStart=/opt/kibana-6.0.1-linux-x86_64/bin/kibana

[Install]
WantedBy=multi-user.target

创建一个SpringBoot应用,需要在pom.xml中引入依赖

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

然后配置日志,logback-spring.xml

<configuration scan="true">
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <appender name="STASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/opt/logs/logback/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/opt/logs/logback/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="INFO">
        <appender-ref ref="STASH" />
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

需要注意日志的名字以及路径,这个后续要和Logstash的配置匹配。这样做,主要是将日志按照格式输出到指定的文件中,方便Logstash监控日志文件,实时获取日志数据。

接下来配置Logstash,/opt/logstash-6.0.1/config/logstash.conf

input {
    file {
        path => "/opt/logs/logback/*.log"
        codec => "json"
        type => "logback"
    }
}

output {
    if [type]=="logback" {
         elasticsearch {
             hosts => [ "localhost:9200" ]
             index => "logback-%{+YYYY.MM.dd}"
        }
    }
}

4.2 使用

启动ElasticSearch和Kibana

sudo systemctl start elasticsearch.service
sudo systemctl start kibana.service

启动SpringBoot应用,然后启动Logstash

sudo bin/logstash -f config/logstash.conf

打开Kibana,稍作配置,就可以查询应用的日志了。

5 小结

本文主要介绍了基于ELK的日志平台搭建,这只是一个最基础的架构,当然,它也不仅仅是适用于基于SpringCloud的微服务架构。随着系统业务量的提升,可以在此基础上继续演进,适配更多的业务架构,处理海量的日志,并且根据业务需求从日志数据中提取更多的信息。

关注我:
使用ELK构建微服务的日志平台

相关推荐