一. 前言
日志對於一個程序的重要程度不用過多的言語修飾,本篇將以實戰的方式講述開源微服務全棧項目 有來商城 是如何整合當下主流日志解決方案 ELK
+Filebeat
。 話不多說,先看實現的效果圖,絕不搞些浪費大家時間且沒意義的東西。
二. 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 network rm elk
五. ELK 部署
1. ElasticSerach 部署
-
創建目錄
mkdir -p /opt/elasticsearch/{config,data} chmod 777 /opt/elasticsearch/{config,data}
-
拉取鏡像
docker pull elasticsearch:7.14.1
-
配置文件
創建配置文件elasticsearch.yml
vi /opt/elasticsearch/config/elasticsearch.yml
添加配置信息
# 允許通過本機所有IP訪問 http.host: 0.0.0.0 # 是否支持跨域,默認為false http.cors.enabled: true http.cors.allow-origin: "*"
-
創建和啟動容器
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。
-
安裝IK分詞器
訪問 https://github.com/medcl/elasticsearch-analysis-ik/releases 查找與 ElasticSearch 版本對應的分詞器,復制其完整下載地址。
docker exec -it elasticsearch /bin/sh cd bin/ elasticsearch-plugin install https://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 部署
-
拉取鏡像
docker pull kibana:7.14.1
-
創建和啟動容器
docker run -d --name kibana --net elk --restart always -p 5601:5601 kibana:7.14.1
訪問 http://e.youlai.tech:5601 ,可以看到Kibana界面
3. Logstash 部署
-
拉取鏡像
docker pull logstash:7.14.1
-
創建目錄
mkdir -p /opt/logstash/{config,data,pipeline} chmod 777 /opt/logstash/{config,data,pipeline}
-
配置文件
-
設置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"
-
管道配置
添加
有來商城
微服務應用日志管道配置,在上面指定了管道配置容器目錄/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 => "http://elasticsearch:9200" index => "youlai-admin-log" } }else if [appname] == "youlai-auth" { elasticsearch { hosts => "http://elasticsearch:9200" index => "youlai-auth-log" } } stdout {} }
可以看到在
output
里根據appname
生成的不同索引庫,其中appname
是filebeat
自定義字段,目的區分多應用日志,自定義字段在Filebeat
部署的時候定義。
-
-
創建和啟動容器
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 部署
-
拉取鏡像
docker pull elastic/filebeat:7.14.1
-
目錄創建
mkdir -p /opt/filebeat/config chmod 777 /opt/filebeat/config
-
配置文件
添加
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.213:5044']
- /logs/youlai-admin/log.log 是應用
youlai-admin
輸出的日志文件路徑 - 47.104.214.213 是部署 Logstash 服務器的IP地址
- /logs/youlai-admin/log.log 是應用
-
容器創建和啟動
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 配置日志輸出路徑指定生產環境輸出至文件
-
日志打印
方便測試,在用戶登錄成功之后獲取用戶信息接口打印日志
-
日志目錄掛載
在
Run/Debug Configurations
配置Dockerfile
時在 IDEA 集成 Docker 插件實現一鍵遠程部署 SpringBoot 應用 基礎上添加 Docker 容器日志目錄/logs/youlai-admin
掛載至宿主機。目錄掛載配置如下, 宿主機
/logs/youlai-admin
←→ 容器/logs/youlai-admin
,點擊OK
保存 -
SpringBoot 應用部署
選擇 Dockerfile 配置然后點擊 Run ▶️ 等待應用發布到雲服務器
八. ElasticSerarch 日志查詢
等待應用發布完成后,訪問 有來商城 線上管理端 www.youlai.tech 登錄后查看應用服務器日志文件 /logs/youlai-admin/log.log
查看日志
查看 Logstash
處理日志
docker logs logstash
訪問 http://e.youlai.tech:5601 進入 Kibana
控制台,首先添加索引模式,才能進行數據探索(Discover),不過前提是存在數據也就是索引庫。
-
添加索引模式,Management → Stack Management → Kibana → Index Patterns → Create Index pattern
-
輸入匹配已存在的索引的規則,點擊
Next step
-
選擇時間字段,點擊
Create index pattern
-
然后左側欄點擊
Analytics
→Discover
進行數據搜索
九. 總結
本篇完整的講述使用 Docker
搭建 ELK
+ Filebeat
環境,通過輕量級日志采集工具 Filebeat
來收集微服務應用日志,並將日志數據推送給Logstash
,經過 Logstash
的過濾處理后將數據存入ElasticSearch
,最終日志數據通過 Kibana
呈現。其實ELK + Filebeat
日志解決方案足夠應對大多數的應用場景,但是考慮到 Logstash
的吞吐量存在瓶頸且收集多個 filebeat
采集過來的日志並做過濾處理,短時間如果有過多的日志會產生日志堆積和數據丟失,嚴重消耗服務器的資源,針對此問題目前最常見的解決方案是在 Filebeat
和 Logstash
引入消息隊列 (Kafka、Redis )進行消峰,讓 Logstash
能夠穩定勻速的處理日志,引入消息隊列在本篇因為時間就沒在本篇做說明了,會在后面的文章補充,如需要可以在網上搜索相關資料做整合,相信基於本篇實戰基礎之上,實現應該不難,希望大家都有所收獲。
附錄
1. 開源項目
項目名稱 | 碼雲(Gitee) | Github |
---|---|---|
微服務后台 | youlai-mall | youlai-mall |
系統管理前端 | youlai-mall-admin | youlai-mall-admin |
微信小程序 | youlai-mall-weapp | youlai-mall-weapp |
2. 聯系信息
微信交流群只能通過邀請方式進入,如果項目中遇到什么問題或者想進入交流群學習的朋友請添加開發人員后由其拉進群,備注“有來”即可。
【有來小店】微信小程序體驗碼 | 進群加我,備注“有來”即可 |
---|---|
![]() |
![]() |