如何將 docker 輸出作為守護程式寫入 stdout/stderr

如何將 docker 輸出作為守護程式寫入 stdout/stderr

所以我們可以將 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 指出的日誌選項以及如下所述的日誌選項文件

一般來說,至少有兩種方法可以做到這一點,以下將簡要討論。

  1. 使用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
  ...
  1. 使用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",
    ...
  }
}

查看清單支援的日誌記錄驅動程式

相關內容