Docker容器日誌的種類以及儲存
Docker 日誌
Docker的日誌可以分為兩類:
-
stdout標準輸出日誌
stdout就是標準輸出裡面的日誌, 比如程式執行時輸出在控制檯的內容就會寫入標準輸出
原理就是當在啟動程序的時候,程序之間有一個父子關係,父程序可以拿到子程序的標準輸出
-
檔案日誌
直接寫入磁碟的日誌, 例如java使用log4j框架直接將日誌落盤(不在控制檯輸出)就是典型的檔案日誌
所有的容器通過Docker Daemon啟動,實際上屬於Docker的一個子程序, 它可以拿到你的容器裡面程序的標準輸出,然後拿到標準輸出之後,會通過它自身的一個叫做LogDriver的模組來處理.
LogDriver就是Docker用來處理容器標準輸出的一個模組。 Docker支援很多種不同的處理方式,比如你的標準輸出之後,在某一種情況下會把它寫到一個日誌裡面.
1. 檢視日誌
可以通過docker logs [containerID]
命令檢視容器的日誌
$ docker logs [OPTIONS] CONTAINER Options: --details 顯示更多的資訊 -f, --follow 跟蹤實時日誌 --since string 顯示自某個timestamp之後的日誌,或相對時間,如42m(即42分鐘) --tail string 從日誌末尾顯示多少行日誌, 預設是all -t, --timestamps 顯示時間戳 --until string 顯示自某個timestamp之前的日誌,或相對時間,如42m(即42分鐘)
例子:
檢視指定時間後的日誌,只顯示最後100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
檢視最近30分鐘的日誌:
$ docker logs --since 30m CONTAINER_ID
檢視某時間之後的日誌:
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
檢視某時間段日誌:
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
2. 日誌在哪?
日誌一般都會落盤在宿主機的/var/lib/docker
資料夾下, 具體的資訊可以通過docker inspect
命令檢視:
$ docker inspect [OPTIONS] CONTAINER
例如:
$ docker inspect -f {{".LogPath"}} 2be
輸出:
/data/docker/containers/2be9b6dc81a557d11d84bc33bf1062462da9b62e59cc9faef9251bdcff26f3ad/2be9b6dc81a557d11d84bc33bf1062462da9b62e59cc9faef9251bdcff26f3ad-json.log
這就是這個容器的日誌記錄檔案了
日誌檔案相關資訊
日誌記錄系統一般都可以對日誌檔案進行拆分, 比如按日期, 按大小等.在Docker的日誌記錄系統下也是可以實現的, 預設情況下一個容器會產生一個日誌檔案, 沒有大小限制, 不會根據日期拆分, 即從容器啟動到容器銷燬, 日誌檔案永遠是那一個.
也可以通過一些配置項進行配置, 例如json-file
模式:
選項 | 描述 | 示例值 |
---|---|---|
max-size |
日誌檔案的最大大小, 預設為-1(無限制) | --log-opt max-size=10m |
max-file |
可以存在的最大日誌檔案數。如果滾動日誌會建立多餘的檔案,則會刪除最早的檔案。僅在max-size 設定時有效。一個正整數。預設為1。 |
--log-opt max-file=3 |
labels |
在啟動Docker守護程式時適用。該守護程式接受的與日誌記錄相關的標籤的逗號分隔列表。用於高階日誌標籤選項。 | --log-opt labels=production_status,geo |
env |
在啟動Docker守護程式時適用。該守護程式接受的與日誌相關的環境變數的逗號分隔列表。用於高階日誌標籤選項。 | --log-opt env=os,customer |
env-regex |
與相似併兼容env 。用於匹配與日誌記錄相關的環境變數的正則表示式。用於高階日誌標籤選項。 |
--log-opt env-regex=^(os|customer). |
compress |
切換旋轉日誌的壓縮。預設值為disabled 。 |
--log-opt compress=true |
3. 配置LogDriver
Docker官方目前支援這些log driver, 預設使用的是json-file
模式:
Driver | Description |
---|---|
none |
丟棄容器輸出 |
local |
日誌以自定義格式儲存 |
json-file |
日誌儲存格式為json, 預設的logdriver驅動 |
syslog |
日誌寫入到指定的syslog地址 |
journald |
日誌寫入到指定jounald |
gelf |
以gelf格式傳送日誌 |
fluentd |
日誌傳送到指定的fluentd服務 |
awslogs |
日誌傳送到指定的Amazon CloudWatch Logs |
splunk |
日誌傳送到指定的splunk服務 |
etwlogs |
日誌傳送到Event Tracing for Windows, 僅支援windows平臺 |
gcplogs |
日誌傳送到Google Cloud日誌系統 |
logentries |
日誌傳送到Rapid7 Logentries |
有兩種方法可以修改docker的LogDriver
-
修改Docker Daemon, 這樣會對所有容器生效, 以syslog為例:
dockerd --log-driver=syslog --log-opt syslog-address=127.0.0.1:514
-
在容器啟動時加上配置項, 這樣配置只會對當前容器生效:
docker run --log-driver=syslog --log-opt syslog-address=127.0.0.1:514 nginx:laster
除了上述的這些logdriver, 也可以自定義logdriver, 並且通過docker plugin install
進行安裝, 詳情可見: