SpringBoot整合ELK實現日誌收集

爲何要用ELK收集日誌

目前大多數項目都是採用微服務架構,在項目的初期,爲了按計劃上線就沒有搭建日誌收集分析平臺,日誌都是保存在服務器本地,看日誌時一個個的找。隨着項目的服務愈來愈多,各個服務都是集羣部署,服務器數量也快速增加,此時就暴露了不少的問題:node

  • 問題排查困難,查詢一個服務的日誌,須要登陸多臺服務器;
  • 日誌串接困難,一個流程有多個節點,要把整個流程的日誌串接起來工做量大;
  • 運維管理困難,不是每一個同事都有登陸服務器查看日誌的權限,但又須要根據日誌排查問題,就須要有權限的同事下載日誌後給到相應負責的同事。
  • 系統預警困難,沒法實現服務出現異常後,及時通知到相應的負責人

後期採用了螞蟻金融雲上的loghub,對日誌進行統一的收集、存儲。因爲loghub不是開源的,對於loghub的具體實現不是太清楚。可是業界通常採用ELK(elasticsearch+logstash+kibana)來收集日誌,其實原理和loghub差很少,下面就結合SpringBoot整合ELK進行講解。spring

ELK的簡介

ELK是三個開源軟件的縮寫,分別表示:elasticsearch、logstash、kibanadocker

  • Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等
  • Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。
  • Kibana能夠爲 Logstash 和 ElasticSearch 經過報表、圖形化數據進行可視化展現 Web 界面,能夠幫助彙總、分析和搜索重要數據日誌。

實現日誌收集的方案

方案一:logstash->elasticsearch->kibanajson

將logstash部署到每一個節點,收集相關的日誌,並通過分析過濾後發送到elasticsearch進行存儲,elasticsearch將數據以分片的形勢進行壓縮存儲,經過kibana對日誌進行圖形化的展現。

優勢:此架構搭建簡單,容易上手緩存

缺點:springboot

  • 一、每一個節點部署logstash,運行時佔用CPU,內存大,會對節點性能形成必定的影響
  • 二、沒有將日誌數據進行緩存,存在丟失的風險

方案二:logstash->kafka->elasticsearch->kibanabash

logstash agent監控過濾日誌,將過濾的日誌內容發送給Kafka,logstash server將日誌收集一塊兒交給elasticsearch,引入了消息隊列機制做爲緩存池,即便logstash server出現異常,因爲日誌暫存在kafka消息隊列中,能避免日誌數據丟失,可是仍是沒有解決性能問題。

此次講解選擇的是第一種方案,第二種方案後期再進行實現服務器

使用docker compose搭建ELK環境

須要提早下載好docker鏡像,elasticsearch、logstash、kibana我選都是6.4.0版本,最好版本要一致restful

docker pull elasticsearch:6.4.0
docker pull logstash:6.4.0
docker pull kibana:6.4.0
複製代碼

在本地建立好存放文件的目錄

建立elasticsearch和logstash目錄,後面用於存放配置文件

新建logstash的配置文件logstash.conf,並上傳到logstash的目錄下

logstash.conf的內容:

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "springboot-%{+YYYY.MM.dd}"
  }
}
複製代碼

使用docker-compose.yml腳本啓動ELK服務

docker-compose.yml的內容爲:架構

version: '3'
services:
  elasticsearch:
    image: elasticsearch:6.4.0
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #設置集羣名稱爲elasticsearch
      - "discovery.type=single-node" #以單一節點模式啓動
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設置使用jvm內存大小
    volumes:
      - /Users/storage/software/docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件掛載
      - /Users/storage/software/docker/elk/elasticsearch/data:/usr/share/elasticsearch/data #數據文件掛載
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: kibana:6.4.0
    container_name: kibana
    links:
      - elasticsearch:es #能夠用es這個域名訪問elasticsearch服務
    depends_on:
      - elasticsearch #kibana在elasticsearch啓動以後再啓動
    environment:
      - "elasticsearch.hosts=http://es:9200" #設置訪問elasticsearch的地址
    ports:
      - 5601:5601
  logstash:
    image: logstash:6.4.0
    container_name: logstash
    volumes:
      - /Users/storage/software/docker/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #掛載logstash的配置文件
    depends_on:
      - elasticsearch #kibana在elasticsearch啓動以後再啓動
    links:
      - elasticsearch:es #能夠用es這個域名訪問elasticsearch服務
    ports:
      - 4560:4560

複製代碼

在該文件的目錄下執行docker-compose命令運行

docker-compose up -d
複製代碼

啓動時間可能有點長,須要耐心等待

在logstash中安裝json_lines插件

# 進入logstash容器(e9c845c8d48e爲容器id)
docker exec -it e9c845c8d48e /bin/bash
# 進入bin目錄
cd /bin/
# 安裝插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重啓logstash服務
docker restart logstash

複製代碼

訪問地址:http://127.0.0.1:9200/

訪問地址:http://127.0.0.1:5601

以上就是elasticsearch和kibana啓動成功的界面

Springboot集成logstash

在pom.xml中添加logstash-logback-encoder依賴

<!--集成logstash-->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.3</version>
</dependency>

複製代碼

添加配置文件logback-spring.xml讓logback的日誌輸出到logstash

<!--輸出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--能夠訪問的logstash日誌收集端口-->
        <destination>127.0.0.1:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    
     <springProfile name="dev">
        <root>
            <level value="INFO"/>
            <appender-ref ref="stdout"/>
            <appender-ref ref="asyncInfo"/>
            <appender-ref ref="asyncWarn"/>
            <appender-ref ref="asyncError"/>
            <appender-ref ref="LOGSTASH"/>
        </root>
    </springProfile>

    <springProfile name="test,prod">
        <root>
            <level value="INFO"/>
            <appender-ref ref="asyncInfo"/>
            <appender-ref ref="asyncWarn"/>
            <appender-ref ref="asyncError"/>
             <appender-ref ref="LOGSTASH"/>
        </root>
    </springProfile>
複製代碼

在kibana中查看日誌信息

建立index pattern

查看收集的日誌

啓動咱們的項目就能夠看到啓動日誌已經輸出到elasticsearch中了

總結

搭建了ELK日誌系統後,咱們就能夠直接在kibana上看系統的日誌了,還能夠進行搜索

相關文章
相關標籤/搜索