如何解决我的统一 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

如果收到连接失败,请完成以下步骤:

  • 确保安全组和网络访问控制列表允许连接。
  • 对于公共端点,请为实例使用互联网网关或 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 官方
AWS 官方已更新 1 年前