高效的監控和日誌管理對保持生產系統持續穩定地運行以及排查問題相當重要。在微服務架構中,因爲容器的數量衆多以及快速變化的特性使得記錄日誌和監控變得愈來愈重要。考慮到容器短暫和不固定的生命週期,當咱們須要 debug 問題時有些容器可能已經不存在了。所以,一套集中式的日誌管理系統是生產環境中不可或缺的組成部分。docker
本章咱們將討論監控容器的各類可用技術和方案,首先會介紹 Docker 自帶的 logs 子命令,而後討論 Docker 的 logging driver,接下來經過實踐學習幾個已經普遍應用的日誌管理方案:ELK、Fluentd 和 Graylog。架構
咱們首先來看一看默認配置下 Docker 的日誌功能。dom
對於一個運行的容器,Docker 會將日誌發送到 容器的 標準輸出設備(STDOUT)和標準錯誤設備(STDERR),STDOUT 和 STDERR 實際上就是容器的控制檯終端。curl
舉個例子,用下面的命令運行 httpd 容器:微服務
docker run -p 80:80 httpd學習
由於咱們在啓動日誌的時候沒有用 -d
參數,httpd 容器之前臺方式啓動,日誌會直接打印在當前的終端窗口。this
若是加上 -d
參數之後臺方式運行容器,咱們就看不到輸出的日誌了。url
root@host1:~# docker run -d -p 81:80 httpd 0aeccbe176442fe521ee1dd19aa9fabb5edf758b64d37412ad3737585847c434 root@host1:~#
這種狀況下若是要查看容器的日誌,有兩種方法:命令行
docker logs
命令查看日誌。先來看 attach 的方法。運行 docker attach
命令。debug
attach 到了 httpd 容器,但並無任何輸出,這是由於當前沒有新的日誌信息。
爲了產生一條新的日誌,能夠在 host 的另外一個命令行終端執行 curl localhost
。
這時,attach 的終端就會打印出新的日誌。
attach 的方法在實際使用中不太方便,由於:
查看容器日誌推薦的方法是用 docker logs
命令。
root@host1:~# docker logs 0aeccbe17644 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Wed Nov 18 09:01:11.542927 2020] [mpm_event:notice] [pid 1:tid 140339416298624] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations [Wed Nov 18 09:01:11.543957 2020] [core:notice] [pid 1:tid 140339416298624] AH00094: Command line: 'httpd -D FOREGROUND' root@host1:~#
docker logs
可以打印出自容器啓動以來完整的日誌,而且 -f
參數能夠繼續打印出新產生的日誌,效果上與 Linux 命令 tail -f
同樣。