Skip to content

如何解決我的統一 CloudWatch 代理程式不推送日誌事件?

2 分的閱讀內容
0

我要解決我的統一 Amazon CloudWatch 代理程式不推送日誌事件。

簡短說明

如果您的統一 CloudWatch 代理程式不推送日誌事件,則可能造成下列原因:

  • 中繼資料不同步
  • 舊版的 CloudWatch 代理程式
  • 無法連線至 CloudWatch Logs 端點
  • 帳戶、AWS 區域,或日誌群組的組態不正確
  • AWS Identity and Access Management (IAM) 的許可不足
  • CloudWatch 代理程式執行錯誤
  • 時間戳記問題
  • 日誌的狀態檔案中遺失或不正確的值
  • 來源日誌檔組態不正確
  • PutLogEvents 限制
  • force_flush_interval

**注意:**下列解決方法不適用於 CloudWatch Container Insights。如需對 CloudWatch Container Insights 進行疑難排解的詳細資訊,請參閱對 Container Insights 進行疑難排解如何對 Amazon EKS 中 Pod 狀態進行疑難排解?

解決方法

中繼資料不同步

如果您的中繼資料不同步,則 CloudWatch 代理程式無法按預期運作。若要解決此問題,請完成下列步驟:

舊版的 CloudWatch 代理程式

如果您的 CloudWatch 代理程式版本已過時,請下載 CloudWatch 代理程式套件版本注意事項和最新版本號碼。最新版本可能會包含可解決問題的更新項目。

無法連線至 CloudWatch Logs 端點

若要測試 CloudWatch Logs 端點的連線功能,請使用下列其中一個命令:

注意: 將 example-region 取代為必要區域。

telnet logs.<example-region>.amazonaws.com 443
nc -zv logs.<example-region>.amazonaws.com 443

如果您收到連線失敗,則請完成下列步驟:

  • 確定安全群組和網路存取控制清單 (網路 ACL) 是否允許連線功能。
  • 對於公用端點,請為執行個體使用網際網路閘道或 NAT 閘道。
  • 如果您使用 Amazon Virtual Private Cloud (Amazon VPC) 端點,則請確定端點解析為 Amazon VPC IP。此外,請確定端點安全群組允許從來源執行個體的存取。

帳戶、區域或日誌群組的組態不正確

對於 CloudWatch 代理程式組態檔,請確認指定的區域是否與主控台區域相符。此外,請確定日誌是否已在正確的帳戶中檢查。

或者,使用 common-config.toml 檔案覆寫 CloudWatch 代理程式的系統預設值:

Linux:

/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
/etc/amazon/amazon-cloudwatch-agent/common-config.toml

Windows:

$Env:ProgramData\Amazon\AmazonCloudWatchAgent\common-config.toml

IAM 許可不足

CloudWatch 代理程式會使用 IAM 使用者或 IAM 角色政策的憑證,將日誌事件推送至 CloudWatch 服務。發佈日誌事件之前,請建立日誌群組和日誌串流。如果沒有日誌群組或日誌串流,則 CloudWatch 代理程式會自行建立。

檢查您的政策是否包括下列 IAM 許可

"logs:CreateLogGroup","logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"

將任何缺少的 IAM 權限新增至使用者政策角色政策

注意:建立 IAM 角色和使用者時,最佳實務是使用 Amazon 建立的 CloudWatchAgentServerPolicyCloudWatchAgentAdminPolicy 政策。

CloudWatch 代理程式執行錯誤

驗證 CloudWatch 代理程式是否執行中。如果代理程式未執行,則請檢查日誌檔位置以取得錯誤:

Linux:

/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

Windows:

$Env:ProgramData\Amazon\AmazonCloudWatchAgent\Logs\amazon-cloudwatch-agent.log

**注意:**自訂的 logfile 位置中可以指定日誌。檢查代理程式組態檔案以識別任何自訂的日誌位置。

使用 debug 參數可在組態檔中開啟詳細的除錯日誌。如果您使用 run_as_user 參數,則請檢查使用者是否具有日誌位置的許可。如果使用者沒有必要的許可,則 CloudWatch 無法將日誌寫入該位置。

如果您在啟動 CloudWatch 代理程式時發現 IMDS 相關問題,則請完成下列步驟:

時間戳記問題

檢查是否有 14 天以上或未來兩小時以上的日誌事件時間戳記。PutLogEvents 命令不允許任何時間範圍內的日誌批次。此外,檢查執行個體上的系統時間服務是否已正確設定。如需詳細資訊,請參閱變更執行個體的時區

日誌的狀態檔案中遺失或不正確的值

若要解決日誌的狀態檔案中遺失或不正確的值,請完成下列步驟:

  1. 確定您的狀態檔案是否位於正確的位置:
    Linux:

    /opt/aws/amazon-cloudwatch-agent/logs/state
    
    

    Windows:

    C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs\state

    **注意:**確定前述的狀態檔是否包含與日誌檔相同的大小值。這會允許讀取新資料並發佈至 CloudWatch。

  2. 檢查狀態檔案的大小值:
    Linux:

    sudo cat /opt/aws/amazon-cloudwatch-agent/logs/state/_var_log_httpd_access_log
    
    

    Windows:

    gc 'C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs\state\C__Program_Files_log.log'
    
    

    **注意:**前述命令的輸出是目前偏移的數值。例如,如果輸出為 34,則目前位偏移為日誌檔的第 34 個位元組。將新的日誌寫入日誌檔時,即會在此位元組讀取日誌。

  3. 檢查日誌檔的大小值:
    Linux:

    stat /var/log/httpd/access_log | grep Size | awk '{print $2}'
    
    

    Windows:

    Get-Item 'C:\Program Files\log.log' | Format-List | findstr Length
  4. 檢查前述步驟 2 和 3 的輸出是否相同。

來源日誌檔組態不正確

若要解決來源日誌檔組態不正確的問題,請完成下列步驟:

  • 檢查 CloudWatch 代理程式組態是否包含您要監控的日誌檔。
  • 確定日誌檔的檔案格式是否正確,並確定是否使用正確的名稱和位置。
  • 從目前的組態中,檢查是否會推送日誌到您要從中擷取資料的相同日誌群組和日誌串流。
  • 檢閱您在執行個體上監控的日誌檔。檢查來源日誌檔是否包含您要發佈至日誌群組的資料。

PutLogEvents 限制

CloudWatch 代理程式會使用 PutLogEvents API 以將日誌事件發佈至 CloudWatch 日誌群組。確定您是否遵守此 API 的限制。如需詳細資訊,請參閱 PutLogEvents

高 force_flush_interval 值

force_flush_interval 會指定日誌在傳送到伺服器之前,可保留在記憶體緩衝區中的最大時間量。如果日誌的大小達到 1 MB 的最大緩衝區,則日誌會立即發佈到 CloudWatch。無論由 force_flush_interval 設定的間隔為何,日誌都會發佈到 CloudWatch。

如果間隔設定為高值且日誌大小未達到 1 MB,則日誌會保留在緩衝區中。日誌會保留在緩衝區中,直到緩衝區已滿或間隔過去為止。在此間隔期間,CloudWatch 中無法使用日誌。確定您將間隔值設定為正確的大小。最佳實務是根據日誌大小和間隔的發佈時間來設定間隔值。

相關資訊

對 CloudWatch 代理程式進行疑難排解

AWS 官方已更新 1 年前