天天看點

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

來自使用者的最佳實踐分享,如何用阿裡開源的Docker日志收集工具fluentd-pilot收集機器上所有Docker應用日志。

fluentd-pilot 具有如下特性:

一個單獨的 fluentd 程序收集機器上所有容器的日志。不需要為每個容器啟動一個 fluentd 程序。

支援檔案日志和 stdout。docker log dirver 亦或 logspout 隻能處理 stdout,fluentd-pilot 不僅支援收集 stdout 日志,還可以收集檔案日志。

聲明式配置。當您的容器有日志要收集,隻要通過 label 聲明要收集的日志檔案的路徑,無需改動其他任何配置,fluentd-pilot 就會自動收集新容器的日志。

支援多種日志存儲方式。無論是強大的阿裡雲日志服務,還是比較流行的 elasticsearch 組合,甚至是 graylog,fluentd-pilot 都能把日志投遞到正确的地點。

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

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

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

其次在RancherAgent主機上面部署一個fluentd-pilot容器,然後在容器裡面啟動的時候,我們要聲明容器的日志資訊,fluentd-pilot會自動感覺所有容器的配置。每次啟動容器或者删除容器的時候,它能夠看得到,當看到容器有新容器産生之後,它就會自動給新容器按照你的配置生成對應的配置檔案,然後去采集,最後采集回來的日志同樣也會根據配置發送到後端存儲裡面去,這裡面後端主要指的elasticsearch或者是SLS這樣的系統,接下來你可以在這個系統上面用一些工具來查詢等等。

可根據實際情況,在每台Agent定義主機标簽,通過主機标簽在每台RancherAgent主機上跑一個pilot容器。用這個指令來部署,其實作在它是一個标準的Docker鏡像,内部支援一些後端存儲,可以通過環境變量來指定日志放到哪兒去,這樣的配置方式會把所有的收集到的日志全部都發送到elasticsearch裡面去,當然兩個挂載是需要的,因為它連接配接Docker,要感覺到Docker裡面所有容器的變化,它要通過這種方式來通路主控端的一些資訊。在Rancher環境下使用以下docker-compose.yml 應用---->添加應用,在可選docker-compose.yml中添加一下内容。

配置好之後啟動自己的應用(例子:tomcat),我們看應用上面要收集的日志,我該在上面做什麼樣的聲明?關鍵的配置有兩個,一是label catalina,聲明的是要收集容器的日志為什麼格式(标準格式等,也可以是檔案。),所有的名字都可以;二是聲明access,這也是個名字,都可以用你喜歡的名字。這樣一個路徑的位址,當你通過這樣的配置來去啟動fluentd-pilot容器之後,它就能夠感覺到這樣一個容器的啟動事件,它會去看容器的配置是什麼,要收集這個目錄下面的檔案日志,然後告訴fluentd-pilot去中心配置并且去采集,這裡還需要一個卷,實際上跟Logs目錄是一緻的,在容器外面實際上沒有一種通用的方式能夠擷取到容器裡面的檔案,所有我們主動把目錄從主控端上挂載進來,這樣就可以在主控端上看到目錄下面所有的東西。

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

當你通過部署之後,他會自己在elasticsearch建立索引,就可以在elasticsearch的kopf上面看到會生成兩個東西,都是自動建立好的,不用管一些配置,你唯一要做的事是什麼呢?就可以在kibana上建立日志index pattern了。然後到日志搜尋界面,可以看到從哪過來的,這條日志的内容是什麼,這些資訊都已經很快的出現了。

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

啟動tomcat的時候,我們聲明了這樣下面兩個,告訴fluentd-pilot這個容器的日志位置。

你還可以在應用容器上添加更多的标簽

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

翟坤,随行付支付有限公司資深運維工程師。

本文版權歸作者所有,轉載請背景留言。

本文轉自 RancherLabs 51CTO部落格,原文連結:http://blog.51cto.com/12462495/2052440