一個單獨log程序,收集機器上所有容器的日志。不需要為每個容器啟動一個log程序
支援檔案日志和stdout。docker log dirver亦或logspout隻能處理stdout,log-pilot不光支援收集stdout日志,還可以收集檔案日志。
聲明式配置。當你的容器有日志要收集,隻要通過label聲明要收集的日志檔案的路徑,無需改動其他任何配置,log-pilot就會自動收集新容器的日志。
支援多種日志存儲方式。無論是強大的阿裡雲日志服務,還是比較流行的elasticsearch組合,甚至是graylog,log-pilot都能把日志投遞到正确的地點。
下面我們先示範一個最簡單的場景:我們先啟動一個log-pilot,再啟動一個tomcat容器,讓log-pilot收集tomcat的日志。為了簡單起見,這裡先不涉及sls或者elk,如果你想在本地玩玩,隻需要有一台運作docker的機器就可以了。
首先啟動log-pilot。要注意的是,以這種方式啟動,由于沒有配置後端使用的日志存儲,所有收集到的日志都會直接輸出到控制台,是以主要用于調試。
打開終端,輸入指令:

你會看到log-pilot啟動的日志。别關終端。新開一個終端啟動tomcat。tomcat鏡像屬于少數同時使用了stdout和檔案日志的docker鏡像,非常适合這裡的示範。
先解釋下這裡的配置。<code>aliyun.logs.catalina=stdout</code>告訴log-pilot這個容器要收集stdout日志,<code>aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt</code>則表示要收集容器内<code>/usr/local/tomcat/logs/</code>目錄下所有名字比對<code>localhost_access_log.*.txt</code>的檔案日志。後面會詳細介紹label的用法。
如果你在本地部署tomcat,而不是在阿裡雲容器服務上,<code>-v /usr/local/tomcat/logs</code>也需要,否則log-pilot沒法讀取到日志檔案。容器服務自動做了優化,不需自己加<code>-v</code>了。
log-pilot會監控docker容器事件,發現帶有<code>aliyun.logs.xxx</code>容器的時候,自動解析容器配置,并且開始收集對應的日志。啟動tomcat之後,你會發現log-pilot的終端立即輸出了一大堆的内容,其中包含tomcat啟動時輸出的stdout日志,也包括log-pilot自己輸出的一些調試資訊。
你可以打開浏覽器通路剛剛部署的tomcat,你會發現每次重新整理浏覽器,在log-pilot的終端裡都能看到類似如下的記錄。其中<code>message</code>後面的内容就是從<code>/usr/local/tomcat/logs/localhost_access_log.xxx.txt</code>裡收集到的日志。
如果你還在運作剛才啟動的<code>log-pilot</code>,先關掉,使用下面的指令啟動,執行之前,注意先把<code>elasticsearch_host</code>和<code>elasticsearch_port</code>兩個變量替換成你實際使用的值。<code>elasticsearch_port</code>一般是9200
相比前面啟動<code>log-pilot</code>的方式,這裡增加了三個環境變量:
<code>fluentd_output=elasticsearch</code>: 把日志發送到elasticsearch
<code>elasticsearch_host=${elasticsearch_host}</code>: elasticsearch的域名
<code>elasticsearch_port=${elasticsearch_port}</code>: elasticsearch的端口号
繼續運作前面的tomcat,再次通路,讓tomcat産生一些日志,所有這些新産生的日志都講發送到elasticsearch裡。打開kibana,這時候你應該還看不到新日志,需要先建立index。log-pilot會把日志寫到elasticsearch特定的index下,規則如下
在前面tomcat裡的例子裡,沒有使用<code>aliyun.logs.tags</code>标簽,是以預設使用了<code>access</code>和<code>catalina</code>作為index。我們先建立index <code>access</code>
建立好index就可以檢視日志了。
容器服務是最适合log-pilot運作的地方,專門為log-pilot做了優化。要在容器服務裡運作log-pilot,你需要做的僅僅是使用下面的編排檔案建立一個新應用。
接下來,你就可以在要收集日志的應用上使用<code>aliyun.logs.xxx</code>标簽了。
啟動tomcat的時候,我們聲明了這樣下面兩個,告訴<code>log-pilot</code>這個容器的日志位置。
你還可以在應用容器上添加更多的标簽
<code>aliyun.logs.$name = $path</code>
變量name是日志名稱,具體指随便是什麼,你高興就好。隻能包含<code>0-9a-za-z_</code>和<code>-</code>
變量path是要收集的日志路徑,必須具體到檔案,不能隻寫目錄。檔案名部分可以使用通配符。<code>/var/log/he.log</code>和<code>/var/log/*.log</code>都是正确的值,但<code>/var/log</code>不行,不能隻寫到目錄。<code>stdout</code>是一個特殊值,表示标準輸出
<code>aliyun.logs.$name.format</code>,日志格式,目前支援
none 無格式純文字
json: json格式,每行一個完整的json字元串
csv: csv格式
<code>aliyun.logs.$name.tags</code>: 上報日志的時候,額外增加的字段,格式為<code>k1=v1,k2=v2</code>,每個key-value之間使用逗号分隔,例如
<code>aliyun.logs.access.tags="name=hello,stage=test"</code>,上報到存儲的日志裡就會出現name字段和stage字段
如果使用elasticsearch作為日志存儲,target這個tag具有特殊含義,表示elasticsearch裡對應的index
對于大部分使用者來說,<code>log-pilot</code>現有功能足以滿足需求,如果遇到沒法滿足的場景怎麼辦?
直接改代碼,再提pr
位址