
所以我們可以將 docker 容器當作守護程式運行:
docker run -d --name foo foo
然後讀取日誌:
docker logs -f foo
但我想知道如何只寫入 stdout/stderr,以便我可以將日誌發送到 splunk 或 cloudwatch 等。
(
docker run --name foo foo &| capture_logs
) & disown
執行此操作的官方方法是什麼?
答案1
您可以使用@Michael 指出的日誌選項以及如下所述的日誌選項文件
一般來說,至少有兩種方法可以做到這一點,以下將簡要討論。
- 使用
splunk
驅動程序,如圖所示這裡。
首先建立一個事件收集器令牌,如文件。該令牌將在 splunk 驅動程式配置中使用。
docker CLI 範例
docker run -d \
--log-driver=splunk \
--log-opt splunk-token=176FCEBF-4CF5-4EDF-91BC-703796522D20 \
--log-opt splunk-url=https://splunkhost:8088 \
--log-opt tag=foo-logs \
--name foo foo
docker-compose 範例
version: '3.7'
services:
foo_app:
...
logging:
driver: splunk
options:
tag: foo-logs
splunk-token: 176FCEBF-4CF5-4EDF-91BC-703796522D20
splunk-url: https://splunkhost:8088
...
- 使用
syslog
驅動程序,如圖所示這裡。
docker CLI 範例:
docker run \
-–log-driver syslog –-log-opt tag=foo-logs \
--name foo foo
docker-compose 範例:
version: '3.7'
services:
foo_app:
...
logging:
driver: syslog
options:
tag: foo-logs
...
這會將所有容器日誌傳送到本機 syslog,您可以從那裡取得日誌並將這些日誌轉發到 splunk 準備接收日誌的外部 udp 連接埠。
假設 Splunk 伺服器將在連接埠上接收日誌,514
那麼您需要將其新增至rsyslogd
設定中,然後重新啟動 rsyslogd 服務
# /etc/rsyslog.d/20-splunk.conf
:syslogtag, contains, "foo-logs" @splunk_url:514;RSYSLOG_SyslogProtocol23Format
或者,如果您打算將其設定為所有容器的全局,那麼您可以透過檔案本身配置日誌記錄,/etc/docker/daemon.json
如下所示(並且不要忘記重新啟動 docker 服務):
的情況下syslog
{
"log-driver": "syslog"
}
的情況下splunk
{
"log-driver": "splunk",
"log-opts": {
"splunk-token": "176FCEBF-4CF5-4EDF-91BC-703796522D20",
"splunk-url": "https://splunkhost:8088",
...
}
}
查看清單支援的日誌記錄驅動程式