Docker Swarm 服務(wù)的日志可以通過執(zhí)行 docker service logs 命令來查看,然而并非所有的日志驅(qū)動(dòng)(Logging Driver)都支持該命令。
Docker 節(jié)點(diǎn)默認(rèn)的配置是,服務(wù)使用 json-file 日志驅(qū)動(dòng),其他的驅(qū)動(dòng)還有 journald(僅用于運(yùn)行有 systemd 的 Linux 主機(jī))、syslog、splunk 和 gelf。
json-file 和 journald 是較容易配置的,二者都可用于 docker service logs 命令。
命令格式為:
docker service logs <service-name>
若使用第三方日志驅(qū)動(dòng),那么就需要用相應(yīng)日志平臺的原生工具來查看日志。
如下是在 daemon.json 配置文件中定義使用 syslog 作為日志驅(qū)動(dòng)的示例。
{
"log-driver": "syslog"
}
通過在執(zhí)行 docker service create 命令時(shí)傳入 --logdriver 和 --log-opts 參數(shù)可以強(qiáng)制某服務(wù)使用一個(gè)不同的日志驅(qū)動(dòng),這會(huì)覆蓋 daemon.json 中的配置。
服務(wù)日志能夠正常工作的前提是,容器內(nèi)的應(yīng)用程序運(yùn)行于 PID 為 1 的進(jìn)程,并且將日志發(fā)送給 STDOUT,錯(cuò)誤信息發(fā)送給 STDERR。日志驅(qū)動(dòng)會(huì)將這些日志轉(zhuǎn)發(fā)到其配置指定的位置。
如下的 docker service logs 命令示例顯示了服務(wù) svc1 的所有副本的日志,可見該服務(wù)在啟動(dòng)副本時(shí)出現(xiàn)了一些錯(cuò)誤。
$ 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
以上輸出內(nèi)容有刪減,不過仍然可以看到來自服務(wù)的 3 個(gè)副本的日志(兩個(gè)運(yùn)行失敗,一個(gè)運(yùn)行成功)。
每一行開頭為副本名稱,其中包括服務(wù)名稱、副本編號、副本 ID 以及所在的主機(jī)。之后是日志消息。
由于輸出內(nèi)容有所刪減,因此失敗原因較難定位,不過看起來似乎是前兩個(gè)副本嘗試連接另一個(gè)啟動(dòng)中的服務(wù)而導(dǎo)致失敗(一種所依賴的服務(wù)未完全啟動(dòng)導(dǎo)致的競態(tài)條件問題)。
對于查看日志命令,可以使用 --follow 進(jìn)行跟蹤、使用 --tail 顯示最近的日志,并使用 --details 獲取額外細(xì)節(jié)。