使用開源工具fluentd-pilot收集容器日誌

來自用戶的最佳實踐分享,如何用阿里開源的Docker日誌收集工具fluentd-pilot收集機器上全部Docker應用日誌。git

fluentd-pilot簡介

fluentd-pilot是阿里開源的docker日誌收集工具,Github項目地址 。你能夠在每臺機器上部署一個fluentd-pilot實例,就能夠收集機器上全部Docker應用日誌。github

fluentd-pilot 具備以下特性:docker

  • 一個單獨的 fluentd 進程收集機器上全部容器的日誌。不須要爲每一個容器啓動一個 fluentd 進程。
  • 支持文件日誌和 stdout。docker log dirver 亦或 logspout 只能處理 stdout,fluentd-pilot 不只支持收集 stdout 日誌,還能夠收集文件日誌。
  • 聲明式配置。當您的容器有日誌要收集,只要經過 label 聲明要收集的日誌文件的路徑,無需改動其餘任何配置,fluentd-pilot 就會自動收集新容器的日誌。
  • 支持多種日誌存儲方式。不管是強大的阿里雲日誌服務,仍是比較流行的 elasticsearch 組合,甚至是 graylog,fluentd-pilot 都能把日誌投遞到正確的地點。

rancher使用fluentd-pilot收集日誌

使用開源工具fluentd-pilot收集容器日誌

咱們既然要用fluentd-pilot,就得先把它啓動起來。還要有一個日誌系統,日誌要集中收集,必然要有一箇中間服務去收集和存儲,因此要先把這種東西準備好。Rancher中咱們要如何作?如圖,首先咱們選擇Rancher的應用商店中的Elasticsearch和Kibana。版本沒有要求,下面使用Elasticsearch2.X和Kibana4。apache

使用開源工具fluentd-pilot收集容器日誌

其次在RancherAgent主機上面部署一個fluentd-pilot容器,而後在容器裏面啓動的時候,咱們要聲明容器的日誌信息,fluentd-pilot會自動感知全部容器的配置。每次啓動容器或者刪除容器的時候,它可以看獲得,當看到容器有新容器產生以後,它就會自動給新容器按照你的配置生成對應的配置文件,而後去採集,最後採集回來的日誌一樣也會根據配置發送到後端存儲裏面去,這裏面後端主要指的elasticsearch或者是SLS這樣的系統,接下來你能夠在這個系統上面用一些工具來查詢等等。json

可根據實際狀況,在每臺Agent定義主機標籤,經過主機標籤在每臺RancherAgent主機上跑一個pilot容器。用這個命令來部署,其實如今它是一個標準的Docker鏡像,內部支持一些後端存儲,能夠經過環境變量來指定日誌放到哪兒去,這樣的配置方式會把全部的收集到的日誌所有都發送到elasticsearch裏面去,固然兩個掛載是須要的,由於它鏈接Docker,要感知到Docker裏面全部容器的變化,它要經過這種方式來訪問宿主機的一些信息。在Rancher環境下使用如下docker-compose.yml 應用---->添加應用,在可選docker-compose.yml中添加一下內容。後端

version: '2'
services:
  pilot:
    image: registry.cn-hangzhou.aliyuncs.com/acs-sample/fluentd-pilot:0.1
    environment:
      ELASTICSEARCH_HOST: elasticsearch
      ELASTICSEARCH_PORT: '9200'
      FLUENTD_OUTPUT: elasticsearch
    external_links:
    - es-cluster/es-master:elasticsearch
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /:/host
    labels:
      aliyun.global: 'true'

配置好以後啓動本身的應用(例子:tomcat),咱們看應用上面要收集的日誌,我該在上面作什麼樣的聲明?關鍵的配置有兩個,一是label catalina,聲明的是要收集容器的日誌爲何格式(標準格式等,也能夠是文件。),全部的名字均可以;二是聲明access,這也是個名字,均可以用你喜歡的名字。這樣一個路徑的地址,當你經過這樣的配置來去啓動fluentd-pilot容器以後,它就可以感受到這樣一個容器的啓動事件,它會去看容器的配置是什麼,要收集這個目錄下面的文件日誌,而後告訴fluentd-pilot去中心配置而且去採集,這裏還須要一個卷,實際上跟Logs目錄是一致的,在容器外面實際上沒有一種通用的方式可以獲取到容器裏面的文件,全部咱們主動把目錄從宿主機上掛載進來,這樣就能夠在宿主機上看到目錄下面全部的東西。tomcat

使用開源工具fluentd-pilot收集容器日誌
使用開源工具fluentd-pilot收集容器日誌

當你經過部署以後,他會本身在elasticsearch建立索引,就能夠在elasticsearch的kopf上面看到會生成兩個東西,都是自動建立好的,不用管一些配置,你惟一要作的事是什麼呢?就能夠在kibana上建立日誌index pattern了。而後到日誌搜索界面,能夠看到從哪過來的,這條日誌的內容是什麼,這些信息都已經很快的出現了。運維

使用開源工具fluentd-pilot收集容器日誌
使用開源工具fluentd-pilot收集容器日誌

Lable說明

啓動tomcat的時候,咱們聲明瞭這樣下面兩個,告訴fluentd-pilot這個容器的日誌位置。elasticsearch

aliyun.logs.tomcat1-access   /opt/apache-tomcat-8.0.14/logs/localhost_access_log.*.txt 
aliyun.logs.catalina   stdout

你還能夠在應用容器上添加更多的標籤ide

aliyun.logs.$name = $path

  • 變量name是日誌名稱,具體指隨即是什麼,你高興就好。只能包含0-9a-zA-Z_和-
  • 變量path是要收集的日誌路徑,必須具體到文件,不能只寫目錄。文件名部分可使用通配符。/var/log/he.log和/var/log/*.log都是正確的值,但/var/log不行,不能只寫到目錄。stdout是一個特殊值,表示標準輸出

aliyun.logs.$name.format,日誌格式,目前支持

  • none 無格式純文本
  • json: json格式,每行一個完整的json字符串
  • csv: csv格式

aliyun.logs.$name.tags: 上報日誌的時候,額外增長的字段,格式爲k1=v1,k2=v2,每一個key-value之間使用逗號分隔,例如

  • aliyun.logs.access.tags="name=hello,stage=test",上報到存儲的日誌裏就會出現name字段和stage字段
  • 若是使用elasticsearch做爲日誌存儲,target這個tag具備特殊含義,表示elasticsearch裏對應的index

做者簡介

翟坤,隨行付支付有限公司資深運維工程師。本文版權歸做者全部,轉載請後臺留言。

相關文章
相關標籤/搜索