1. 程式人生 > 實用技巧 >Docker容器日誌的種類以及儲存

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進行安裝, 詳情可見:

使用日誌記錄驅動程式外掛