應(yīng)用日志的收集、分析和監(jiān)控是日常運維工作重要的部分,妥善地處理應(yīng)用日志收集往往是應(yīng)用容器化重要的一個課題。
Docker處理日志的方法是通過docker engine捕捉每一個容器進(jìn)程的STDOUT和STDERR,通過為contrainer制定不同log driver 來實現(xiàn)容器日志的收集,缺省json-file log driver是將容器的STDOUT/STDERR 輸出保存在磁盤上,然后用戶就能使用docker logs <container>來進(jìn)行查詢。
在部署一個傳統(tǒng)的應(yīng)用的時候,應(yīng)用程序記錄日志的方式通常記錄到文件里, 一般(但不一定)會記錄到/var/log目錄下。應(yīng)用容器化后,不同于以往將所有日志放在主機系統(tǒng)的統(tǒng)一位置,日志分散在很多不同容器的相互隔離的環(huán)境中。
如何收集應(yīng)用寫在容器內(nèi)日志記錄,有以下挑戰(zhàn):
1) 資源消耗
如果在每個容器運行一個日志收集進(jìn)程, 比如logstatsh/fluentd 這類的日志工具,在主機容器密度高的時候,logstatsh/fluentd這類日志采集工具會消耗大量的系統(tǒng)資源。上面這種方法是最簡單直觀的,也是最消耗資源的。
2) 應(yīng)用侵入
一些傳統(tǒng)應(yīng)用,特別是legacy 系統(tǒng),寫日志機制往往是沒法配置和更改的,包括應(yīng)用日志的格式,存放地址等等。日志采集機制,要盡量避免要求修改應(yīng)用。
3) 日志來源識別
采用統(tǒng)一應(yīng)用日志收集方案,日志分散在很多不同容器的相互隔離的環(huán)境中,需要解決日志的來源識別問題。
日志來源識別的功能借助了rancher平臺為container_name的命名的規(guī)則特性,可以做到即使一個容器在運行過程中被調(diào)度到另外一臺主機,也可以識別日志來源。
容器化應(yīng)用日志收集方案
下面是我們設(shè)計的一個低資源資源消耗、無應(yīng)用侵入、可以清楚識別日志來源的統(tǒng)一日志收集方案,該方案已經(jīng)在睿云智合的客戶有成功實施案例。
在該方案中,會在每個host 部署一個wise2c-logger,wise2C會listen docker engine的event,當(dāng)有新容器創(chuàng)建和銷毀時,會去判斷是否有和日志相關(guān)的local volume 被創(chuàng)建或者銷毀了,根據(jù)lables,wise2c-logger 會動態(tài)配置logstatsh的input、filter 和output,實現(xiàn)應(yīng)用日志的收集和分發(fā)。
1) 應(yīng)用如何配置
應(yīng)用容器化時候,需要在為應(yīng)用容器掛載一個專門寫有日志的volume,為了區(qū)別該volume 和容器其它數(shù)據(jù)volume,我們把該volume 定義在容器中,通過volume_from 指令share 給應(yīng)用容器,下面是一個例子:demo應(yīng)用的docker-compose file
web-data 容器使用一個local volume,mount到/var/log目錄(也可以是其它目錄),在web-data中定義了幾個標(biāo)簽, io.wise2c.logtype說明這個容器中包含了日志目錄,標(biāo)簽里面的值elasticsearch、kafka可以用于指明log的output或者過濾條件等。
那么我們現(xiàn)在來看下wiselogger大致的工作流程:
監(jiān)聽新的日志容器->獲取日志容器的type和本地目錄->生成新的logstash配置:
1)wise2c-looger 偵聽docker events 事件, 檢查是否有一個日志容器創(chuàng)建或者被銷毀;
2)當(dāng)日志容器被創(chuàng)建后(通過container label 判斷), inspect 容器的volume 在主機的path;
3)重新配置wise2c-logger 內(nèi)置的logstatsh 的配置文件,設(shè)置新的input, filter 和output 規(guī)則。
這里是把wise2c-logger在rancher平臺上做成catalog需要的docker-compose.yml的截圖,大家可以配合上面的流程描述一起看一下。
優(yōu)化
目前我們還在對Wise2C-logger 作進(jìn)一步的優(yōu)化:
1)收集容器的STDOUT/STDERR日志
特別是對default 使用json-file driver的容器,通過掃描容器主機的json-file 目錄,實現(xiàn)容器STDIN/STDERR日志的收集。
2)更多的內(nèi)置日志收集方案
目前內(nèi)置缺省使用logstatsh 作日志的收集,和過濾和一些簡單的轉(zhuǎn)碼邏輯。未來wise2C-logger 可以支持一些更輕量級的日志收集方案,比如fluentd、filebeat等。
Q & A
Q:有沒有做過性能測試?我這邊模塊的日志吞吐量比較大。比如在多少量級的日志輸出量基礎(chǔ)上,主要為logger模塊預(yù)留多少系統(tǒng)資源,保證其正常穩(wěn)定工作?