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

1 概述

在微服務架構中,會部署衆多的應用,其中有基礎應用,好比:網關,服務發現等。同時還有大量的業務應用。因此,如何有效的收集它們的日誌,而且方便查詢,同時提供友好的可視化展現,對於應對微服務架構的複雜性有很大的幫助。在高複雜度的系統中,對於定位線上問題,日誌很是重要。ELK(ElasticSearch+Logstash+Kibana),可使用說是目前最流行的日誌平臺構建方案,之因此深受開發者喜好,主要是由於它解決了大規模系統的日誌收集的各類痛點。linux

2 ELK Stack

ELK(ElasticSearch+Logstash+Kibana),主要包含三個組件:spring

  • ElasticSearchjson

  • Logstashubuntu

  • Kibana性能優化

 

2.1 ElasticSearch

ElasticSearch是一個開源的分佈式的搜索引擎,它主要基於Apache Lucene。在整個ELK Stack中,ElasticSearch是最核心的組件,它存儲數據,而且提供了許多靈活而實用的Rest API,因此,上層應用能夠根據須要去查詢數據,使用數據,分析數據。在日誌平臺中,全部的日誌數據都存儲到ElasticSearch中,藉助其強大的搜索能力,能夠很靈活的查詢日誌。架構

2.2 Logstash

Logstash主要用於收集數據,並將數據保存到ElasticSearch中。併發

Logstash有豐富插件,而且易於擴展,因此,可使用Logstash收集到數據後,能夠作不少處理,最終再將數據輸出到ElasticSearch中。在日誌平臺中,它主要複雜採集應用的日誌。app

2.3 Kibana

Kibana主要負責讀取ElasticSearch中的數據,並進行可視化展現。而且,它還自帶Tool,能夠方便調用ElasticSearch的Rest API。在日誌平臺中,咱們經過Kibana查看日誌。elasticsearch

3 架構

使用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的微服務架構。隨着系統業務量的提高,能夠在此基礎上繼續演進,適配更多的業務架構,處理海量的日誌,而且根據業務需求從日誌數據中提取更多的信息。

在此給你們推薦一個Java架構方面的交流學習羣:698581634,裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系,主要針對Java開發人員提高本身,突破瓶頸,相信你來學習,會有提高和收穫。在這個羣裏會有你須要的內容  朋友們請抓緊時間加入進來吧。

相關文章
相關標籤/搜索