查看日志
<h2></h2>
上節(jié)課我們學(xué)習(xí)了BFF的思想,并針對mst-user-service、mst-order-service忿薇、mst-goods-service三個服務(wù)搭建了一套BFF架構(gòu)。但到目前為止漆诽,我們每個服務(wù)的日志依舊分散亭畜,這對于日志的收集砾层、管理、檢索十分不便贱案。因此,本節(jié)課將采用EFK這套日志數(shù)據(jù)管理解決方案來集中化管理服務(wù)日志止吐。
本節(jié)課主要內(nèi)容:
- 介紹EFK是什么
- 如何配置consul
- 如何在Kibana查看日志
<h2 id="1">#EFK介紹</h2>
EFK由ElasticSearch宝踪、Fluentd和Kiabana三個開源工具組成。其中Elasticsearch是一款分布式搜索引擎碍扔,能夠用于日志的檢索瘩燥,F(xiàn)luentd是一個實時開源的數(shù)據(jù)收集器,而Kibana 是一款能夠為Elasticsearch 提供分析和可視化的 Web 平臺。這三款開源工具的組合為日志數(shù)據(jù)提供了分布式的實時搜集與分析的監(jiān)控系統(tǒng)不同。
而在此之前厉膀,業(yè)界是采用ELK(Elasticsearch + Logstash + Kibana)來管理日志。Logstash是一個具有實時渠道能力的數(shù)據(jù)收集引擎,但和fluentd相比二拐,它在效能上表現(xiàn)略遜一籌服鹅,故而逐漸被fluentd取代,ELK也隨之變成EFK百新。
ELK架構(gòu)
為了更好的了解EFK的架構(gòu)企软,首先,我們先理解下ELK架構(gòu)饭望。在此之前仗哨,
我們需要清楚如下幾個概念:
- Log Source:日志來源。在微服務(wù)中铅辞,我們的日志主要來源于日志文件和Docker容器厌漂,日志文件包括服務(wù)器log,例如Nginx access log(記錄了哪些用戶斟珊,哪些頁面以及用戶瀏覽器苇倡、ip和其他的訪問信息), error log(記錄服務(wù)器錯誤日志)等。
- Logstash:數(shù)據(jù)收集處理引擎囤踩,可用于傳輸docker各個容器中的日志給EK雏节。支持動態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù),并對數(shù)據(jù)進(jìn)行過濾高职、分析钩乍、豐富、統(tǒng)一格式等操作怔锌,然后存儲以供后續(xù)使用寥粹。
- Filebeat:和Logstash一樣屬于日志收集處理工具变过,基于原先 Logstash-fowarder 的源碼改造出來的。與Logstash相比涝涤,filebeat更加輕量媚狰,占用資源更少
- ElasticSearch:日志搜索引擎
- Kibana:用于日志展示的可視化工具
- Grafana:類似Kibana,可對后端的數(shù)據(jù)進(jìn)行實時展示
下圖是ELK架構(gòu)阔拳,采用ElasticSearch崭孤、Kibana、Grafana糊肠、Filebeat來管理Docker容器日志辨宠。
由圖可知,當(dāng)我們在Docker中運(yùn)行應(yīng)用(application)時货裹,filebeat收集容器中的日志嗤形。ElasticSearch收到日志對日志進(jìn)行實時存儲、搜索與分析弧圆。我們可在Kibana和Grafana這兩個可視化工具中查看日志的操作結(jié)果赋兵。
EFK架構(gòu)
Fluentd是一個開源的數(shù)據(jù)收集器,專為處理數(shù)據(jù)流設(shè)計搔预,使用JSON作為數(shù)據(jù)格式霹期。它采用了插件式的架構(gòu),具有高可擴(kuò)展性高可用性拯田,同時還實現(xiàn)了高可靠的信息轉(zhuǎn)發(fā)经伙。
因此,我們加入Fluentd來收集日志勿锅。加入后的EFK架構(gòu)如圖所示帕膜。
在這個圖中,上下兩個框分別表示使用Fluentd前后的日志收集溢十。在第二個框中垮刹,Consul能夠使用靈活的key/value倉庫去存儲動態(tài)配置。而confd能夠使用從consul來的模版管理本地配置张弛。
<h2 id="2">搭建EFK</h2>
1.參考fluentd的官方文檔荒典,我們創(chuàng)建EFK項目,項目目錄結(jié)構(gòu)如下:
2.配置docker-compose.yml文件
version: '2'
services:
elasticsearch:
image: elasticsearch:5-alpine
volumes:
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
ports:
- 9200:9200
- 9300:9300
kibana:
image: bitnami/kibana:5-master
volumes:
- ./kibana/config/:/usr/share/kibana/config:ro
depends_on:
- elasticsearch
ports:
- 5601:5601
filebeat:
image: prima/filebeat:5.6
volumes:
- ./filebeat/app.log:/var/log/app.log
- ./filebeat/config/filebeat.yml:/filebeat.yml
depends_on:
- elasticsearch
nginx:
image: nginx:1.12-alpine
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- 8080:80
logging:
driver: fluentd
options:
fluentd-address: localhost:5140
fluentd-async-connect: 'true'
tag: nginx.backend
fluent:
image: demo/fluentd:v0.14
environment:
FLUENTD_CONF: fluent.conf
ports:
- 5140:5140
- 5044:5044
stdin_open: true
tty: true
depends_on:
- elasticsearch
3.下載docker鏡像
docker pull elasticsearch:5-alpine
docker pull bitnami/kibana:5-master
docker pull prima/filebeat:5.6
docker pull nginx:1.12-alpine
docker build -t demo/fluentd:v0.14 .
<h2 id="3">配置Consul</h2>
1.啟動consul代理
consul agent -dev -node=consul -data-dir=/tmp/consul
啟動完成登錄http://localhost:8500/
2.在Consul中創(chuàng)建Key/Value
-
fluentd/source
:source可定義日志來源吞鸭。每一個來源配置必須包含類型(type)寺董,比如tcp數(shù)據(jù)輸入,或者json類型輸入刻剥。
<source>
@type forward
port 5140
</source>
<source>
@type beats
metadata_as_tag
<parse>
@type json
</parse>
</source>
-
fluentd/filter
:filter就是過濾規(guī)則遮咖,當(dāng)source.tag復(fù)合filter的規(guī)則時,就執(zhí)行這個filter進(jìn)行過濾行為造虏。我們將數(shù)據(jù)格式化為json御吞,并過濾出key的名字為log的數(shù)據(jù)麦箍。
<filter nginx.**>
@type parser
format json
key_name log
reserve_data true
</filter>
-
fluentd/match
:match是fluentd收到數(shù)據(jù)后的處理, @type elasticsearch表示把數(shù)據(jù)輸入到elasticsearch上面陶珠。
<match nginx.backend>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix nginx
</match>
<match docker.**>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix app
</match>
創(chuàng)建完成如圖所示:
4.啟動fluentd_workshop挟裂,mst-user-service、mst-order-service揍诽、mst-goods-service诀蓉。
<h2 id="4">查看日志</h2>
1.打開http://localhost:5601,進(jìn)入kibana暑脆。
2.創(chuàng)建索引渠啤,索引即 Elasticsearch 中的索引。我們需要手動配置饵筑。在 Index Pattern 下邊的輸入框中輸入 nginx-*,它是 Elasticsearch 中的一個索引名稱開頭处坪。
Kibana 會自動檢測在 Elasticsearch 中是否存在該索引名稱根资,如果有,則下邊出現(xiàn) “Create” 按鈕同窘,如圖所示
3.點(diǎn)擊左側(cè) “Discovery” 菜單玄帕,同時用postman給mst-user-service發(fā)請求,此時想邦,在kibana中可以查看所收集的有關(guān)nginx到日志裤纹。
Kibana功能眾多,例如在“Visualize” 菜單界面可以將查詢出的數(shù)據(jù)進(jìn)行可視化展示丧没,“Dev Tools” 菜單界面可以讓戶方便地通過瀏覽器直接與 Elasticsearch 進(jìn)行交互鹰椒,發(fā)送 RESTFUL對 Elasticsearch 數(shù)據(jù)進(jìn)行增刪改查。如果你想要詳細(xì)的了解它呕童,可以參考它的中文文檔http://www.code123.cc/docs/kibana-logstash/v3/panels/trends.html