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