Docker Swarm 服務的日志可以通過執行 docker service logs 命令來查看,然而并非所有的日志驅動(Logging Driver)都支持該命令。
Docker 節點默認的配置是,服務使用 json-file 日志驅動,其他的驅動還有 journald(僅用于運行有 systemd 的 Linux 主機)、syslog、splunk 和 gelf。
json-file 和 journald 是較容易配置的,二者都可用于 docker service logs 命令。
命令格式為:
docker service logs <service-name>
若使用第三方日志驅動,那么就需要用相應日志平臺的原生工具來查看日志。
如下是在 daemon.json 配置文件中定義使用 syslog 作為日志驅動的示例。
{
"log-driver": "syslog"
}
通過在執行 docker service create 命令時傳入 --logdriver 和 --log-opts 參數可以強制某服務使用一個不同的日志驅動,這會覆蓋 daemon.json 中的配置。
服務日志能夠正常工作的前提是,容器內的應用程序運行于 PID 為 1 的進程,并且將日志發送給 STDOUT,錯誤信息發送給 STDERR。日志驅動會將這些日志轉發到其配置指定的位置。
如下的 docker service logs 命令示例顯示了服務 svc1 的所有副本的日志,可見該服務在啟動副本時出現了一些錯誤。
$ docker service logs seastack_reverse_proxy
svc1.1.zhc3cjeti9d4@wrk-2 | [emerg] 1#1: host not found...
svc1.1.6m1nmbzmwh2d@wrk-2 | [emerg] 1#1: host not found...
svc1.1.6m1nmbzmwh2d@wrk-2 | nginx: [emerg] host not found..
svc1.1.zhc3cjeti9d4@wrk-2 | nginx: [emerg] host not found..
svc1.1.1tmya243m5um@mgr-1 | 10.255.0.2 "GET / HTTP/1.1" 302
以上輸出內容有刪減,不過仍然可以看到來自服務的 3 個副本的日志(兩個運行失敗,一個運行成功)。
每一行開頭為副本名稱,其中包括服務名稱、副本編號、副本 ID 以及所在的主機。之后是日志消息。
由于輸出內容有所刪減,因此失敗原因較難定位,不過看起來似乎是前兩個副本嘗試連接另一個啟動中的服務而導致失敗(一種所依賴的服務未完全啟動導致的競態條件問題)。
對于查看日志命令,可以使用 --follow 進行跟蹤、使用 --tail 顯示最近的日志,并使用 --details 獲取額外細節。