View a markdown version of this page

將日誌傳送至 Amazon CloudWatch - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將日誌傳送至 Amazon CloudWatch

OTel Container Insights 會使用 OpenTelemetry Collector 的日誌管道,收集容器日誌並將其傳送至 Amazon CloudWatch Logs。Amazon CloudWatch Observability EKS 附加元件會將 OpenTelemetry Collector 部署為 DaemonSet,使用 filelog 接收器來結尾容器日誌檔案、將它們充實為 Kubernetes 中繼資料,並透過 CloudWatch Logs 匯出工具將其匯出至 CloudWatch Logs。

基本日誌收集不需要額外的設定。當您遵循 時,預設會啟用日誌集合快速入門:Amazon EKS 上的 OTel Container Insights

先決條件

設定日誌收集之前,請確認您符合下列要求。

  • 在叢集上安裝的 OTel Container Insights 和作用中amazon-cloudwatch-observability的附加元件

  • IAM 許可:logs:CreateLogGrouplogs:CreateLogStreamlogs:DescribeLogGroupslogs:PutLogEventslogs:DescribeLogStreams(包含在 CloudWatchAgentServerPolicy受管政策中)

  • 節點存取:收集器需要存取每個節點/var/log/pods上的

日誌群組和來源

下表說明 OTel Container Insights 建立的日誌群組及其收集來源。

日誌群組 來源 目錄
/aws/containerinsights/cluster-name/application /var/log/pods/**/*.log 所有容器 stdout 和 stderr 日誌
注意

主機和資料平面日誌將在未來版本中提供。

OTel 日誌管道的運作方式

附加元件的 OpenTelemetry Collector 會使用下列元件執行日誌管道。

  • 接收者filelog接收者會從 結尾容器日誌檔案/var/log/pods/

  • 處理器k8sattributes 處理器會使用 Kubernetes 中繼資料擴充日誌。batch 處理器會在匯出之前批次處理日誌記錄。resource 處理器會附加資源屬性。

  • 匯出工具awscloudwatchlogs 匯出工具會將日誌記錄傳送至 CloudWatch Logs。

日誌擴充

管道會使用下列屬性豐富每個日誌記錄。

  • Kubernetes 資源屬性k8s.pod.namek8s.namespace.namek8s.node.namek8s.container.namek8s.deployment.name

  • Pod 標籤 – 所有做為k8s.pod.label.*屬性的 Pod 標籤

  • 雲端屬性cloud.account.idcloud.regioncloud.platform

  • 叢集屬性k8s.cluster.name

自訂日誌集合

您可以透過更新附加元件組態值來自訂日誌集合。下列各節說明常見的自訂選項。

停用日誌集合

若要完全停用日誌收集,請在停用容器日誌的情況下更新附加元件組態。

停用日誌集合
  • 執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":false}}' \ --resolve-conflicts OVERWRITE

從日誌集合中排除命名空間

若要從日誌集合中排除特定命名空間,請使用 excludeNamespaces組態選項。

從日誌集合中排除命名空間
  • 執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name。將命名空間值取代為您要排除的命名空間。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"excludeNamespaces":["kube-system","load-testing","monitoring"]}}' \ --resolve-conflicts OVERWRITE

僅包含特定命名空間

若要僅從特定命名空間收集日誌,請使用 includeNamespaces組態選項。

僅包含特定命名空間
  • 執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name。將命名空間值取代為您要包含的命名空間。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"includeNamespaces":["production","staging"]}}' \ --resolve-conflicts OVERWRITE

設定多行日誌剖析

若要將多行日誌項目 (例如堆疊追蹤) 合併為單一日誌記錄,請使用一行模式設定多行剖析。

設定多行日誌剖析
  • 執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name。將 firstLinePattern 值取代為符合每個日誌項目第一行的 regex 模式。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"multilineConfig":{"firstLinePattern":"^\\d{4}-\\d{2}-\\d{2}|^\\[\\d{4}","parseFormat":"auto"}}}' \ --resolve-conflicts OVERWRITE

設定日誌保留

根據預設,CloudWatch Logs 會無限期保留日誌資料。若要控制儲存成本,您可以在日誌群組上設定保留政策。

設定日誌保留
  • 執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name。以保留日誌的天數取代 30

    aws logs put-retention-policy \ --log-group-name "/aws/containerinsights/cluster-name/application" \ --retention-in-days 30

驗證

若要驗證日誌收集是否正常運作,請檢查預期的日誌群組是否存在並包含資料。

驗證日誌集合
  • 執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name

    aws logs describe-log-groups \ --log-group-name-prefix "/aws/containerinsights/cluster-name" \ --query "logGroups[].{Name:logGroupName,StoredBytes:storedBytes}" \ --output table

    輸出會顯示日誌群組名稱和儲存的位元組數。的非零值會StoredBytes確認管道正在交付日誌。

疑難排解

使用以下指引來解決常見的日誌收集問題。

5 分鐘後未建立日誌群組

徵狀:/aws/containerinsights/cluster-name/application日誌群組在 5 分鐘後不會出現在 CloudWatch Logs 中。

原因:收集器沒有建立日誌群組和日誌串流所需的 IAM 許可。

解決方案:確認與收集器相關聯的 IAM 角色已連接 CloudWatchAgentServerPolicy受管政策。此政策包含 logs:CreateLogGrouplogs:CreateLogStream許可。

應用程式日誌群組存在,但空白

徵狀:應用程式日誌群組存在於 CloudWatch Logs 中,但不包含日誌串流或日誌事件。

原因:當容器未寫入 stdout 或 stderr,或 filelog 接收器無法存取節點/var/log/pods/時,就會發生此問題。

解決方案:完成下列步驟以解決此問題。

  1. 確認您的應用程式容器將日誌寫入 stdout 或 stderr。

  2. 檢查收集器 DaemonSet Pod 是否有 的磁碟區掛載/var/log/pods

    kubectl get daemonset -n amazon-cloudwatch -o yaml | grep -A 5 "var/log/pods"
  3. 檢查收集器日誌是否有檔案存取錯誤。

    kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --tail=50 | grep -i "error\|permission"

高 CloudWatch Logs 成本

徵狀:CloudWatch Logs 擷取或儲存成本高於預期。

原因:大量命名空間 (例如負載測試或監控命名空間) 會產生大量日誌。

解決方案:完成下列步驟以降低成本。

  1. 從日誌集合中排除大量命名空間。如需說明,請參閱從日誌集合中排除命名空間

  2. 在日誌群組上設定保留政策,以自動刪除較舊的日誌。如需說明,請參閱設定日誌保留