基于Fluentd的日志收集方案

EFK介紹

搭建EFK

配置Consul

查看日志
<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容器日志。

version1.png

由圖可知,當(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)如圖所示。

version2.png

在這個(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)如下:

category.png

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)建完成如圖所示:


consul.png

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” 按鈕,如圖所示

index.png

3.點(diǎn)擊左側(cè) “Discovery” 菜單,同時(shí)用postman給mst-user-service發(fā)請求,此時(shí),在kibana中可以查看所收集的有關(guān)nginx到日志。

log.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容