SpringBoot 整合 Elastic Stack 最新版本(7.14.1)分散式日誌解決方案,開源微服務全棧項目【有來商城】的日誌落地實踐

一. 前言

日誌對於一個程式的重要程度不用過多的言語修飾,本篇將以實戰的方式講述開源微服務全棧項目 有來商城 是如何整合當下主流日誌解決方案 ELK +Filebeat 。 話不多說,先看實現的效果圖,絕不搞些浪費大家時間且沒意義的東西。

image-20210925120303663

二. Elastic Stask 技術棧

1. 為什麼引入 Filebeat ?

ELK 作為分散式日誌解決方案讓人為之津津樂道,即使沒有實踐過也能耳熟,可見其火熱程度。 Beats 作為數據採集器後來加入進來 Elastic 家族,ELK正式更名為 Elastic Stack。 在屬於 ELK 的那個時代,數據採集是由 Logstash 完成,還有比 Filebeat 更為強大的過濾處理能力,這樣便不禁讓人心生疑問,為什麼還要引入 Filebeat 呢?是多此一舉嗎?先看下官方給 Beats的解釋:

輕量型,從源頭採集,簡單明了。

Beats 能夠採集符合 Elastic Common Schema (ECS) 要求的數據,如果您希望擁有更加強大的處理能力,Beats 能夠將數據轉發至 Logstash 進行轉換和解析。

其中重點的關鍵字從源頭收集,更加輕量。

Logstash 擁有比 Filebeat 更為豐富的功能,但能力越大,背負的越多,意味著 Logstash 作為採集工具會比 Filebeat 佔用更多的系統資源。其中有個依據Logstash 默認的堆記憶體大小是 1G,Filebeat 佔用記憶體僅僅大概是 10M 左右。

2. ELK +Filebeat 日誌解決方案流程

Filebeat 會定時監聽事先指定的日誌文件,如果日誌文件有變化,會將數據推送至 Logstash ,經過 Logstash 過濾篩選處理將我們想要的日誌數據存入ElasticSearch,最終通過 Kibana 將數據呈現出來。

三. 環境準備

實戰環境這裡我使用 有來商城 線上雲伺服器做的,因伺服器資源有限所以做了堆記憶體保守的設置,大家可以用虛擬機測試。

💻伺服器 配置 開放埠 說明 記憶體
e.youlai.tech 1核2G 5044 ,5601, 9200 ELK部署伺服器 ELK+IK分詞器實際佔用1.4G
f.youlai.tech 1核2G SpringBoot 應用埠 Filebeat + SpringBoot 應用部署伺服器 300M±

四. 自定義網路

保證同一網路下的容器 (ElasticSearch、Logstash、Kibana)相互訪問。

  • 創建自定義網路elk

    docker network create elk
    
  • 查看已有網路

    docker network ls
    

    Docker自帶3種網路模式 bridge、host、none

    Docker 自定義網路模式

  • 刪除已有網路

    docker network rm elk
    

五. ELK 部署

1. ElasticSerach 部署

  1. 創建目錄

    mkdir -p /opt/elasticsearch/{config,data}
    chmod 777 /opt/elasticsearch/{config,data}
    
  2. 拉取鏡像

    Docker Hub 鏡像倉庫查看 Elastic Search 最新版本

    docker pull elasticsearch:7.14.1
    
  3. 配置文件

    創建配置文件elasticsearch.yml

    vi /opt/elasticsearch/config/elasticsearch.yml
    

    添加配置資訊

    # 允許通過本機所有IP訪問
    http.host: 0.0.0.0
    # 是否支援跨域,默認為false
    http.cors.enabled: true 
    http.cors.allow-origin: "*" 
    
  4. 創建和啟動容器

    docker run -d --name elasticsearch --net elk --restart always \
    -p 9200:9200 -p 9300:9300  \
    -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
    -e "discovery.type=single-node" \
    -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    -v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
    elasticsearch:7.14.1
    

    JVM堆記憶體大小設置 128M 時,安裝 IK 分詞器的時候會報錯,建議堆記憶體設置至少 256M。

  5. 安裝IK分詞器

    訪問 //github.com/medcl/elasticsearch-analysis-ik/releases 查找與 ElasticSearch 版本對應的分詞器,複製其完整下載地址。

    image-20210912233224637

    docker exec -it elasticsearch /bin/sh
    cd bin/
    elasticsearch-plugin install //github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.1/elasticsearch-analysis-ik-7.14.1.zip
    

    查看已安裝的IK分詞器

    elasticsearch-plugin list
    

    重啟 ElasticSearch

    docker restart elasticsearch
    

    刪除分詞器

    elasticsearch-plugin remove analysis-ik
    

2. Kibana 安裝

  1. 拉取鏡像

    Docker Hub 鏡像倉庫查看 Kibana 最新版本

    docker pull kibana:7.14.1
    
  2. 創建和啟動容器

    docker run -d --name kibana --net elk --restart always -p 5601:5601 kibana:7.14.1
    

    訪問 www.youlai.tech:5601 ,可以看到Kibana介面

    image-20210909005108839

3. LogStash 部署

  1. 拉取鏡像

    Docker Hub 鏡像倉庫查看 Logstash 最新版本

    docker pull logstash:7.14.1
    
  2. 創建目錄

    mkdir -p /opt/logstash/{config,data,pipeline}
    chmod 777 /opt/logstash/{config,data,pipeline} 
    
  3. 配置文件

    • 設置JVM堆記憶體大小

      vi /opt/logstash/config/jvm.options
      

      添加配置資訊

      -Xmx128m
      -Xms128m
      
    • Logstash配置

      vi /opt/logstash/config/logstash.yml
      

      添加配置資訊

      # 允許通過本機所有IP訪問
      http.host: "0.0.0.0"
      # 指定使用管道ID
      xpack.management.pipeline.id: ["main"]
      
    • 管道ID和配置文件路徑映射

      vi /opt/logstash/config/pipelines.yml 
      

      添加管道ID和管道配置文件目錄映射,注意符號 – 前後都要有空格(巨坑)

       - pipeline.id: main
         path.config: "/usr/share/logstash/pipeline"
      

      image-20210909010902840

    • 管道配置

      添加 有來商城 微服務應用日誌管道配置,在上面指定了管道配置容器目錄 /usr/share/logstash/pipeline , 後面啟動 Logstash 時會將其掛載至宿主機目錄 /opt/logstash/pipeline,接下來只要在宿主機目錄下添加管道配置文件 youlai-log.config 就可以被 Logstash 自動載入生效。

      vi /opt/logstash/pipeline/youlai-log.config
      

      添加完整內容如下

      input {
       beats {
          port => 5044
          client_inactivity_timeout => 36000
        }
      }
      filter {
         mutate {
              remove_field => ["@version"]
              remove_field => ["tags"]
         }
      }
      output {
        if [appname] == "youlai-admin" {
           elasticsearch {
             hosts => "//elasticsearch:9200"
             index => "youlai-admin-log"
           }
        }else if [appname] == "youlai-auth" {
           elasticsearch {
             hosts => "//elasticsearch:9200"
             index => "youlai-auth-log"
           }
        }
        stdout {}
      }
      

      可以看到在 output 里根據 appname 生成的不同索引庫,其中 appnamefilebeat 自定義欄位,目的區分多應用日誌,自定義欄位在 Filebeat部署的時候定義。

  4. 創建和啟動容器

    docker run -d --name logstash --net elk --restart always \
    -p 5044:5044 -p 9600:9600 \
    -v /opt/logstash/config:/usr/share/logstash/config \
    -v /opt/logstash/data:/usr/share/logstash/data \
    -v /opt/logstash/pipeline:/usr/share/logstash/pipeline \
    logstash:7.14.1
    

六. Filebeat 部署

  1. 拉取鏡像

    Docker Hub 鏡像倉庫查看 Filebeat 版本

    docker pull elastic/filebeat:7.14.1
    
  2. 目錄創建

    mkdir -p /opt/filebeat/config
    chmod 777 /opt/filebeat/config
    
  3. 配置文件

    添加 filebeat.yml 配置文件

    vi /opt/filebeat/config/filebeat.yml
    

    添加如下配置:

    filebeat.inputs:
    - type: log
      enabled: true
      paths:
      - /logs/youlai-admin/log.log
      fields:
        appname: youlai-admin  # 自定義欄位,提供給 Logstash 用於區分日誌來源
      fields_under_root: true  # 開啟自定義欄位
    - type: log
      enabled: true
      paths:
      - /logs/youlai-auth/log.log
      fields:
        appname: youlai-auth
      fields_under_root: true
    
    processors:
      - drop_fields:
          fields: ["log","input","host","agent","ecs"] # 過濾不需要的欄位
    
    output.logstash:
      hosts: ['47.104.214.204:5044']
    
    • /logs/youlai-admin/log.log 是應用 youlai-admin 輸出的日誌文件路徑
    • 47.104.214.204 是部署 Logstash 伺服器的IP地址
  4. 容器創建和啟動

    docker run -d --name filebeat --restart=always \
    --log-driver json-file \
    --log-opt max-size=100m \
    --log-opt max-file=2  \
    -v /logs:/logs \
    -v /opt/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
    elastic/filebeat:7.14.1
    

七. SpringBoot 應用部署和日誌配置

在文章 IDEA 集成 Docker 插件實現一鍵遠程部署 SpringBoot 應用 中已經詳細講述 youlai-admin 服務是如何部署到線上雲環境,接下來補充日誌配置。

  • 日誌配置

    youlai-mall 的日誌公共模組 common-log 下的 logback-spring.xml 配置日誌輸出路徑

    image-20210924005332571

    指定生產環境輸出至文件

    image-20210923082220267

  • 日誌列印

    方便測試,在用戶登錄成功之後獲取用戶資訊介面列印日誌

    image-20210923231727665

  • 日誌目錄掛載

    Run/Debug Configurations 配置 Dockerfile 時在 IDEA 集成 Docker 插件實現一鍵遠程部署 SpringBoot 應用 基礎上添加 Docker 容器日誌目錄 /var/log/youlai-admin 掛載至宿主機。

    image-20210923083233346

    目錄掛載配置如下, 宿主機 /var/log/youlai-admin ←→ 容器 /var/log/youlai-admin,點擊 OK 保存

    image-20210924005556442

  • SpringBoot 應用部署

    選擇 Dockerfile 配置然後點擊 Run ▶️ 等待應用發布到雲伺服器

    image-20210924000428418

八. ElasticSerarch 日誌查詢

等待應用發布完成後,訪問 有來商城 線上管理端 www.youlai.tech 登錄後查看應用伺服器日誌文件 /logs/youlai-admin/log.log 查看日誌

查看 Logstash 處理日誌

docker logs logstash

image-20210924075544548

訪問 //d.youlai.tech:5601 進入 Kibana 控制台,首先添加索引模式,才能進行數據探索(Discover),不過前提是存在數據也就是索引庫。

  1. 添加索引模式,Management → Stack Management → Kibana → Index Patterns → Create Index pattern

    image-20210924081655072

  2. 輸入匹配已存在的索引的規則,點擊 Next step

    image-20210924084023811

  3. 選擇時間欄位,點擊 Create index pattern

    image-20210924082824207

  4. 然後左側欄點擊 Analytics Discover 進行數據搜索

    image-20210924083102767

    image-20210924221543819

九. 總結

本篇完整的講述使用 Docker 搭建 ELK + Filebeat 環境,通過輕量級日誌採集工具 Filebeat 來收集微服務應用日誌,並將日誌數據推送給Logstash ,經過 Logstash 的過濾處理後將數據存入ElasticSearch,最終的日誌數據通過 Kibana呈現。其實ELK + Filebeat日誌解決方案足夠應對大多數的應用場景,但是考慮到 Logstash 的吞吐量存在瓶頸且收集多個 filebeat 採集過來的日誌並做過濾處理,短時間如果有過多的日誌會產生日誌堆積和數據丟失,嚴重消耗伺服器的資源,針對此問題目前最常見的解決方案是在 FilebeatLogstash 引入消息隊列 (Kafka、Redis )進行消峰,讓 Logstash 能夠穩定勻速的處理日誌,引入消息隊列在本篇因為時間就沒在本篇做說明了,會在後面的文章補充,如需要可以在網上搜索相關資料做整合,相信基於本篇實戰基礎之上,實現應該不難,希望大家都有所收穫。

附錄

1. 開源項目

項目名稱 碼雲(Gitee) Github
微服務後台 youlai-mall youlai-mall
系統管理前端 youlai-mall-admin youlai-mall-admin
微信小程式 youlai-mall-weapp youlai-mall-weapp

2. 聯繫資訊

微信交流群只能通過邀請方式進入,如果項目中遇到什麼問題或者想進入交流群學習的朋友請添加開發人員後由其拉進群,備註「有來」即可。

【有來小店】微信小程式體驗碼 進群加我,備註「有來」即可