使用ELK構建微服務的日誌平臺

noONE發表於2018-08-23

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的微服務架構。隨著系統業務量的提升,可以在此基礎上繼續演進,適配更多的業務架構,處理海量的日誌,並且根據業務需求從日誌資料中提取更多的資訊。關注我,瞭解更多:

me

相關文章