Amazon CloudWatch Logs 記錄檔驅動程式

awslogs 記錄驅動程式會將容器記錄傳送到 Amazon CloudWatch LogsAWS 管理主控台AWS SDK 和命令列工具用法

若要使用 awslogs 驅動程式作為預設記錄驅動程式,請在 daemon.json 檔案中將 log-driverlog-opt 鍵設定為適當的值,該檔案位於 Linux 主機上的 /etc/docker/ 或 Windows Server 上的 C:\ProgramData\docker\config\daemon.json。如需使用 daemon.json 設定 Docker 的詳細資訊,請參閱 daemon.json。以下範例將記錄驅動程式設定為 awslogs 並設定 awslogs-region 選項。

{
  "log-driver": "awslogs",
  "log-opts": {
    "awslogs-region": "us-east-1"
  }
}

重新啟動 Docker 以使變更生效。

您可以使用 docker run--log-driver 選項來設定特定容器的記錄驅動程式

$ docker run --log-driver=awslogs ...

如果您使用 Docker Compose,請使用以下宣告範例設定 awslogs

myservice:
  logging:
    driver: awslogs
    options:
      awslogs-region: us-east-1

Amazon CloudWatch Logs 選項

您可以將記錄選項新增至 daemon.json 以設定 Docker 的全域預設值,或在啟動容器時使用 --log-opt NAME=VALUE 旗標來指定 Amazon CloudWatch Logs 記錄驅動程式選項。

awslogs-region

awslogs 記錄驅動程式會將您的 Docker 記錄傳送到特定區域。使用 awslogs-region 記錄選項或 AWS_REGION 環境變數來設定區域。預設情況下,如果您的 Docker daemon 正在 EC2 執行個體上執行且未設定區域,則驅動程式會使用執行個體的區域。

$ docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...

awslogs-endpoint

預設情況下,Docker 使用 awslogs-region 記錄選項或偵測到的區域來建構遠端 CloudWatch Logs API 端點。使用 awslogs-endpoint 記錄選項可以用提供的端點覆寫預設端點。

注意事項

awslogs-region 記錄選項或偵測到的區域會控制用於簽名的區域。如果您使用 awslogs-endpoint 指定的端點使用不同的區域,則可能會發生簽名錯誤。

awslogs-group

您必須為 awslogs 記錄驅動程式指定 記錄群組

awslogs-stream

若要設定應使用哪個 記錄串流

注意事項

指定記錄群組內的記錄串流一次只能由一個容器使用。同時將相同的記錄串流用於多個容器可能會降低記錄效能。

awslogs-create-group

如果記錄群組不存在,記錄驅動程式預設會傳回錯誤。但是,您可以將 awslogs-create-group 設定為 true 以根據需要自動建立記錄群組。awslogs-create-group 選項預設為 false

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-create-group=true \
    ...

注意事項

在您嘗試使用 awslogs-create-group 之前,您的 AWS IAM 策略必須包含 logs:CreateLogGroup 權限。

awslogs-create-stream

預設情況下,日誌驅動程式會建立用於儲存容器日誌的 AWS CloudWatch Logs 串流。

awslogs-create-stream 設定為 false 可停用日誌串流建立。停用後,Docker daemon 會假設日誌串流已存在。這種設定在另一個程序處理日誌串流建立,以避免冗餘的 AWS CloudWatch Logs API 呼叫時很有用。

如果 awslogs-create-stream 設定為 false 且日誌串流不存在,則在容器執行期間將日誌儲存到 CloudWatch 將會失敗,並在 daemon 日誌中產生 Failed to put log events 錯誤訊息。

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-stream=myLogStream \
    --log-opt awslogs-create-stream=false \
    ...

awslogs-datetime-format

awslogs-datetime-format 選項使用 Python strftime 格式定義多行起始模式。日誌訊息由符合模式的一行和任何不符合模式的後續行組成。因此,匹配的行是日誌訊息之間的分隔符。

使用此格式的一個用例範例是解析輸出(例如堆疊傾印),否則可能會記錄在多個條目中。正確的模式允許將其捕獲在單個條目中。

如果同時設定了 awslogs-datetime-formatawslogs-multiline-pattern,則此選項始終優先。

注意事項

多行日誌記錄會對所有日誌訊息執行正規表達式解析和匹配,這可能會對日誌記錄效能產生負面影響。

考慮以下日誌串流,其中新的日誌訊息以時間戳記開頭

[May 01, 2017 19:00:01] A message was logged
[May 01, 2017 19:00:04] Another multi-line message was logged
Some random message
with some random words
[May 01, 2017 19:01:32] Another message was logged

該格式可以表示為 strftime 表達式 [%b %d, %Y %H:%M:%S],並且可以將 awslogs-datetime-format 值設定為該表達式

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-datetime-format='\[%b %d, %Y %H:%M:%S\]' \
    ...

這會將日誌解析為以下 CloudWatch 日誌事件

# First event
[May 01, 2017 19:00:01] A message was logged

# Second event
[May 01, 2017 19:00:04] Another multi-line message was logged
Some random message
with some random words

# Third event
[May 01, 2017 19:01:32] Another message was logged

支援以下 strftime 代碼

代碼意義範例
%a星期幾的縮寫名稱。週一
%A星期幾的全名。星期一
%w星期幾的十進制數字,其中 0 是星期日,6 是星期六。0
%d月份中的日期,以零填充的十進制數字表示。08
%b月份的縮寫名稱。二月
%B月份的全名。二月
%m月份,以零填充的十進制數字表示。02
%Y帶世紀的年份,以十進制數字表示。2008
%y不帶世紀的年份,以零填充的十進制數字表示。08
%H小時(24 小時制),以零填充的十進制數字表示。19
%I小時(12 小時制),以零填充的十進制數字表示。07
%p上午或下午。上午
%M分鐘,以零填充的十進制數字表示。57
%S秒,以零填充的十進制數字表示。04
%L毫秒,以零填充的十進制數字表示。.123
%f微秒,以零填充的十進制數字表示。000345
%zUTC 偏移量,格式為 +HHMM 或 -HHMM。+1300
%Z時區名稱。PST
%j一年中的日期,以零填充的十進制數字表示。363

awslogs-multiline-pattern

awslogs-multiline-pattern 選項使用正規表達式定義多行起始模式。日誌訊息由符合模式的一行和任何不符合模式的後續行組成。因此,匹配的行是日誌訊息之間的分隔符。

如果也設定了 awslogs-datetime-format,則會忽略此選項。

注意事項

多行日誌記錄會對所有日誌訊息執行正規表達式解析和匹配。這可能會對日誌記錄效能產生負面影響。

考慮以下日誌串流,其中每個日誌訊息都應以模式 INFO 開頭

INFO A message was logged
INFO Another multi-line message was logged
     Some random message
INFO Another message was logged

您可以使用正規表達式 ^INFO

$ docker run \
    --log-driver=awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=myLogGroup \
    --log-opt awslogs-multiline-pattern='^INFO' \
    ...

這會將日誌解析為以下 CloudWatch 日誌事件

# First event
INFO A message was logged

# Second event
INFO Another multi-line message was logged
     Some random message

# Third event
INFO Another message was logged

標籤

指定 tag 作為 awslogs-stream 選項的替代方案。 tag 解釋 Go 模板標記,例如 {{.ID}}{{.FullID}}{{.Name}} docker.{{.ID}}。有關支援的模板替換的詳細資訊,請參閱 tag 選項文件

當同時指定 awslogs-streamtag 時,為 awslogs-stream 提供的值會覆蓋使用 tag 指定的模板。

如果未指定,則容器 ID 將用作日誌串流。

注意事項

CloudWatch 日誌 API 不支援在日誌名稱中使用 :。當使用 {{ .ImageName }} 作為標籤時,這可能會導致一些問題,因為 Docker 鏡像的格式為 IMAGE:TAG,例如 alpine:latest。可以使用模板標記來取得正確的格式。要取得映像名稱和容器 ID 的前 12 個字元,您可以使用

--log-opt tag='{{ with split .ImageName ":" }}{{join . "_"}}{{end}}-{{.ID}}'

輸出類似於:alpine_latest-bf0072049c76

awslogs-force-flush-interval-seconds

awslogs 驅動程式會定期將日誌刷新到 CloudWatch。

awslogs-force-flush-interval-seconds 選項會更改日誌刷新間隔秒數。

預設值為 5 秒。

awslogs-max-buffered-events

awslogs 驅動程式會緩衝日誌。

awslogs-max-buffered-events 選項會更改日誌緩衝區大小。

預設值為 4K。

憑證

您必須向 Docker daemon 提供 AWS 憑證才能使用 awslogs 日誌驅動程式。您可以使用 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 環境變數、預設的 AWS 共享憑證檔案(root 使用者的 ~/.aws/credentials)或如果您在 Amazon EC2 執行個體上執行 Docker daemon,則可以使用 Amazon EC2 執行個體設定檔來提供這些憑證。

憑證必須套用允許 logs:CreateLogStreamlogs:PutLogEvents 操作的策略,如下例所示。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}