在微服務架構中,會部署衆多的應用,其中有基礎應用,好比:網關,服務發現等。同時還有大量的業務應用。因此,如何有效的收集它們的日誌,而且方便查詢,同時提供友好的可視化展現,對於應對微服務架構的複雜性有很大的幫助。在高複雜度的系統中,對於定位線上問題,日誌很是重要。ELK(ElasticSearch+Logstash+Kibana),可使用說是目前最流行的日誌平臺構建方案,之因此深受開發者喜好,主要是由於它解決了大規模系統的日誌收集的各類痛點。linux
ELK(ElasticSearch+Logstash+Kibana),主要包含三個組件:spring
ElasticSearch是一個開源的分佈式的搜索引擎,它主要基於Apache Lucene。在整個ELK Stack中,ElasticSearch是最核心的組件,它存儲數據,而且提供了許多靈活而實用的Rest API,因此,上層應用能夠根據須要去查詢數據,使用數據,分析數據。在日誌平臺中,全部的日誌數據都存儲到ElasticSearch中,藉助其強大的搜索能力,能夠很靈活的查詢日誌。json
Logstash主要用於收集數據,並將數據保存到ElasticSearch中。ubuntu
Logstash有豐富插件,而且易於擴展,因此,可使用Logstash收集到數據後,能夠作不少處理,最終再將數據輸出到ElasticSearch中。在日誌平臺中,它主要複雜採集應用的日誌。bash
Kibana主要負責讀取ElasticSearch中的數據,並進行可視化展現。而且,它還自帶Tool,能夠方便調用ElasticSearch的Rest API。在日誌平臺中,咱們經過Kibana查看日誌。架構
使用ELK構建了一個日誌平臺架構:app
這是一個最簡化版的日誌收集架構,不少基於ELK的日誌架構是從它演化而來,核心的問題就是日誌數據都保存到ElasticSearch中。好比說,能夠先將日誌收集到Kafka中,而後再由Logstash採集數據輸出到ElasticSearch中,引入了Kafka,就給使用數據增長了不少可能性。elasticsearch
系統:Ubuntu16.06 64分佈式
去官網下載ElasticSearch、Logstash、Kibana,注意儘可能保持版本一致,此處使用6.0的大版本,爲了便於演示,所有ELK程序和Java應用都安裝到一臺機器上,目錄以下:spring-boot
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
複製代碼
爲了方便管理,使用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}"
}
}
}
複製代碼
啓動ElasticSearch和Kibana
sudo systemctl start elasticsearch.service
sudo systemctl start kibana.service
複製代碼
啓動SpringBoot應用,而後啓動Logstash
sudo bin/logstash -f config/logstash.conf
複製代碼
打開Kibana,稍做配置,就能夠查詢應用的日誌了。
本文主要介紹了基於ELK的日誌平臺搭建,這只是一個最基礎的架構,固然,它也不單單是適用於基於SpringCloud的微服務架構。隨着系統業務量的提高,能夠在此基礎上繼續演進,適配更多的業務架構,處理海量的日誌,而且根據業務需求從日誌數據中提取更多的信息。關注我,瞭解更多: