查看日志
<h2></h2>
上節(jié)課我們學(xué)習(xí)了BFF的思想,并針對mst-user-service、mst-order-service、mst-goods-service三個(gè)服務(wù)搭建了一套BFF架構(gòu)。但到目前為止,我們每個(gè)服務(wù)的日志依舊分散,這對于日志的收集、管理、檢索十分不便。因此,本節(jié)課將采用EFK這套日志數(shù)據(jù)管理解決方案來集中化管理服務(wù)日志。
本節(jié)課主要內(nèi)容:
- 介紹EFK是什么
- 如何配置consul
- 如何在Kibana查看日志
<h2 id="1">#EFK介紹</h2>
EFK由ElasticSearch、Fluentd和Kiabana三個(gè)開源工具組成。其中Elasticsearch是一款分布式搜索引擎,能夠用于日志的檢索,F(xiàn)luentd是一個(gè)實(shí)時(shí)開源的數(shù)據(jù)收集器,而Kibana 是一款能夠?yàn)镋lasticsearch 提供分析和可視化的 Web 平臺。這三款開源工具的組合為日志數(shù)據(jù)提供了分布式的實(shí)時(shí)搜集與分析的監(jiān)控系統(tǒng)。
而在此之前,業(yè)界是采用ELK(Elasticsearch + Logstash + Kibana)來管理日志。Logstash是一個(gè)具有實(shí)時(shí)渠道能力的數(shù)據(jù)收集引擎,但和fluentd相比,它在效能上表現(xiàn)略遜一籌,故而逐漸被fluentd取代,ELK也隨之變成EFK。
ELK架構(gòu)
為了更好的了解EFK的架構(gòu),首先,我們先理解下ELK架構(gòu)。在此之前,
我們需要清楚如下幾個(gè)概念:
- Log Source:日志來源。在微服務(wù)中,我們的日志主要來源于日志文件和Docker容器,日志文件包括服務(wù)器log,例如Nginx access log(記錄了哪些用戶,哪些頁面以及用戶瀏覽器、ip和其他的訪問信息), error log(記錄服務(wù)器錯(cuò)誤日志)等。
- Logstash:數(shù)據(jù)收集處理引擎,可用于傳輸docker各個(gè)容器中的日志給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)行實(shí)時(shí)展示
下圖是ELK架構(gòu),采用ElasticSearch、Kibana、Grafana、Filebeat來管理Docker容器日志。

由圖可知,當(dāng)我們在Docker中運(yùn)行應(yīng)用(application)時(shí),filebeat收集容器中的日志。ElasticSearch收到日志對日志進(jìn)行實(shí)時(shí)存儲、搜索與分析。我們可在Kibana和Grafana這兩個(gè)可視化工具中查看日志的操作結(jié)果。
EFK架構(gòu)
Fluentd是一個(gè)開源的數(shù)據(jù)收集器,專為處理數(shù)據(jù)流設(shè)計(jì),使用JSON作為數(shù)據(jù)格式。它采用了插件式的架構(gòu),具有高可擴(kuò)展性高可用性,同時(shí)還實(shí)現(xiàn)了高可靠的信息轉(zhuǎn)發(fā)。
因此,我們加入Fluentd來收集日志。加入后的EFK架構(gòu)如圖所示。

在這個(gè)圖中,上下兩個(gè)框分別表示使用Fluentd前后的日志收集。在第二個(gè)框中,Consul能夠使用靈活的key/value倉庫去存儲動態(tài)配置。而confd能夠使用從consul來的模版管理本地配置。
<h2 id="2">搭建EFK</h2>
1.參考fluentd的官方文檔,我們創(chuàng)建EFK項(xiàng)目,項(xiàng)目目錄結(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可定義日志來源。每一個(gè)來源配置必須包含類型(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ī)則時(shí),就執(zhí)行這個(gè)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 中的一個(gè)索引名稱開頭。
Kibana 會自動檢測在 Elasticsearch 中是否存在該索引名稱,如果有,則下邊出現(xiàn) “Create” 按鈕,如圖所示

3.點(diǎn)擊左側(cè) “Discovery” 菜單,同時(shí)用postman給mst-user-service發(fā)請求,此時(shí),在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