在微服務架構中,會部署衆多的應用,其中有基礎應用,好比:網關,服務發現等。同時還有大量的業務應用。因此,如何有效的收集它們的日誌,而且方便查詢,同時提供友好的可視化展現,對於應對微服務架構的複雜性有很大的幫助。在高複雜度的系統中,對於定位線上問題,日誌很是重要。ELK(ElasticSearch+Logstash+Kibana),可使用說是目前最流行的日誌平臺構建方案,之因此深受開發者喜好,主要是由於它解決了大規模系統的日誌收集的各類痛點。linux
ELK(ElasticSearch+Logstash+Kibana),主要包含三個組件:spring
ElasticSearchjson
Logstashubuntu
Kibana性能優化
ElasticSearch是一個開源的分佈式的搜索引擎,它主要基於Apache Lucene。在整個ELK Stack中,ElasticSearch是最核心的組件,它存儲數據,而且提供了許多靈活而實用的Rest API,因此,上層應用能夠根據須要去查詢數據,使用數據,分析數據。在日誌平臺中,全部的日誌數據都存儲到ElasticSearch中,藉助其強大的搜索能力,能夠很靈活的查詢日誌。架構
Logstash主要用於收集數據,並將數據保存到ElasticSearch中。併發
Logstash有豐富插件,而且易於擴展,因此,可使用Logstash收集到數據後,能夠作不少處理,最終再將數據輸出到ElasticSearch中。在日誌平臺中,它主要複雜採集應用的日誌。app
Kibana主要負責讀取ElasticSearch中的數據,並進行可視化展現。而且,它還自帶Tool,能夠方便調用ElasticSearch的Rest API。在日誌平臺中,咱們經過Kibana查看日誌。elasticsearch
使用ELK構建了一個日誌平臺架構:分佈式
這是一個最簡化版的日誌收集架構,不少基於ELK的日誌架構是從它演化而來,核心的問題就是日誌數據都保存到ElasticSearch中。好比說,能夠先將日誌收集到Kafka中,而後再由Logstash採集數據輸出到ElasticSearch中,引入了Kafka,就給使用數據增長了不少可能性。
系統: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
爲了方便管理,使用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的微服務架構。隨着系統業務量的提高,能夠在此基礎上繼續演進,適配更多的業務架構,處理海量的日誌,而且根據業務需求從日誌數據中提取更多的信息。
在此給你們推薦一個Java架構方面的交流學習羣:698581634,裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系,主要針對Java開發人員提高本身,突破瓶頸,相信你來學習,會有提高和收穫。在這個羣裏會有你須要的內容 朋友們請抓緊時間加入進來吧。