本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點擊查看更多容器化技術相關系列文章。監控和日志歷來都是系統穩定運行和問題排查的關鍵,在微服務架構中,數量眾多的容器以及快速變化的特性使得一套集中式的日志管理系統變成了生產環境中一個不可獲取的部分。此次話題我們會集中在日志管理方面,本篇會介紹Docker自帶的logs子命令以及其Logging driver。
一、Docker logs子命令
默認情況下,Docker的日志會發送到容器的標准輸出設備(STDOUT)和標准錯誤設備(STDERR),其中STDOUT和STDERR實際上就是容器的控制台終端。
我們可以通過logs子命令來查看具體某個容器的日志輸出:
docker logs edc-k8s-demo
這時看到的日志是靜態的,截止到目前為止的日志。如果想要持續看到新打印出的日志信息,那么可以加上 -f 參數,如:
docker logs -f edc-k8s-demo
二、Docker logging driver
剛剛我們學習了默認配置下,Docker日志會發送到STDOUT和STDERR。但實際上,Docker還提供了其他的一些機制允許我們從運行的容器中提取日志,這些機制統稱為 logging driver。
對Docker而言,其默認的logging driver是json-file,如果在啟動時沒有特別指定,都會使用這個默認的logging driver。
json-file會將我們在控制台通過docker logs命名看到的日志都保存在一個json文件中,我們可以在服務器Host上的容器目錄中找到這個json文件。
容器日志路徑:/var/lib/docker/containers/<container-id>/<container-id>-json.log
例如我們可以查看一個exceptionless-api容器的json日志:
一個快速查看某個容器的日志文件路徑的方法:
docker inspect exceptionless_api_1
通過inspect命令,可以查到該容器的ID及一系列配置信息,我們重點關注LogPath即可:
查到LogPath后,即可復制其后面的日志路徑了,打開這個json文件你就可以看到輸出的容器日志了。
除了json-file,Docker還支持以下多種logging dirver,來源:Configure logging drivers
其中,none 代表禁用容器日志,不會輸出任何容器日志。
其他幾個logging driver解釋如下:
- syslog 與 journald 是Linux上的兩種日志管理服務
- awslog、splunk 與 gcplogs是第三方日志托管服務
- gelf 與 fluentd 是兩種開源的日志管理方案
我們可以在容器啟動時通過加上 --log-driver 來指定使用哪個具體的 logging driver,例如:
docker run -d --log-driver=syslog ......
如果想要設置默認的logging driver,那么則需要修改Docker daemon的啟動腳本,例如:
{ "log-driver": "json-file", "log-opts": { "labels": "production_status", "env": "os,customer" } }
每個logging driver都有一些自己特定的log-opt,使用時可以參考具體官方文檔。
三、小結
本文介紹了Docker自帶的logs子命令以及logging driver,默認的logging driver是json-file,當然Docker還支持多個不同機制的logging dirver,我們可以根據自己的需要在使用時進行指定。下一篇,我們會學習流行的開源日志管理三兄弟ELK(ElasticSearch、Logstash、Kibana)。