跳至内容

为什么统一 CloudWatch 代理无法发送日志事件?

2 分钟阅读
0

统一 Amazon CloudWatch 代理无法发送日志事件,我想解决这个问题。

解决方法

以下解决方法不适用于 CloudWatch Container Insights。要对 CloudWatch Container Insights 进行故障排除,请参阅 Container Insights 故障排除

元数据不同步

元数据不同步可能会导致您的 CloudWatch 代理出现问题。

要解决此问题,请执行以下操作:

  • 在安装 CloudWatch 代理之前,创建亚马逊机器映像 (AMI),从原始实例中捕获唯一信息。
  • 使用 AWS CloudFormation、AWS Systems Manager、用户数据脚本或命令行在启动时安装 CloudWatch 代理
  • 对于 Windows 实例,请在使用 AMI 时使用 Sysprep

CloudWatch 代理的版本已过时

检查您当前正在使用的 CloudWatch 代理的版本。如果 CloudWatch 代理已过时,请下载并安装最新版本的 CloudWatch 代理包。最新版本可能包含可解决您问题的更新。

无法连接到 CloudWatch Logs 端点

**注意:**在以下命令中,将 example-region 替换为您的 AWS 区域。

要测试与 CloudWatch Logs 端点的连接,请运行以下命令之一:

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

默认情况下,Windows 计算机未安装 netcat。请在 Windows PowerShell 上运行以下 Test-NetConnection 命令:

Test-NetConnection -ComputerName logs.example-region.amazonaws.com -Port 443

如果连接失败,请执行以下操作:

  • 确保安全组和网络访问控制列表(网络 ACL)允许连接。
  • 对于公有端点,请为实例使用互联网网关或 NAT 网关。
  • 如果使用 Amazon Virtual Private Cloud (Amazon VPC) 端点,请确保端点解析为 Amazon VPC IP 地址。此外,确保端点安全组允许从源实例访问。

账户、区域或日志组配置不正确

对于 CloudWatch 代理配置文件,确保指定的区域与控制台区域匹配。此外,请务必在正确的 AWS 账户中检查日志。

要覆盖 CloudWatch 代理的系统默认设置,请使用以下 common-config.toml 文件位置。

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,CloudWatch 代理需使用来自 AWS Identity and Access Management (IAM) 用户或 IAM 角色策略的凭证。

检查您的基于身份的策略是否包含以下 IAM 权限:

  • logs:CreateLogGroup
  • logs:CreateLogStream
  • logs:PutLogEvents
  • logs:DescribeLogStreams

将缺失的 IAM 权限添加到用户策略角色策略

创建 IAM 角色或用户时,最佳做法是使用 CloudWatchAgentServerPolicyCloudWatchAgentAdminPolicy 策略。

如果没有日志组或日志流,则 CloudWatch 代理会进行创建。在发布日志事件之前,请创建一个日志组日志流

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) 问题,请执行以下操作:

时间戳问题

CloudWatch 代理使用 PutLogEvents API 操作将日志事件发布到 CloudWatch 日志组。检查您的日志事件是否符合 PutLogEvents API 操作限制。此外,请检查您是否已正确配置实例的时区

日志状态文件中的值不正确

要解决日志状态文件中缺失或不正确的值,请完成以下步骤:

  1. 确认状态文件位于正确的位置。<br id=hardline_break/> 对于 Linux,请使用以下文件位置:<br id=hardline_break/> /opt/aws/amazon-cloudwatch-agent/logs/state<br id=hardline_break/> 对于 Windows,请使用以下文件位置:<br id=hardline_break/> C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs\state<br id=hardline_break/> **注意:**确保上述状态文件包含与日志文件相同的大小值,以便 CloudWatch 代理能够读取新数据并将其发布到 CloudWatch 日志组。

  2. 检查状态文件的大小值。<br id=hardline_break/> 对于 Linux,请运行以下 sudo 命令:

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

    对于 Windows,请运行以下 Windows PowerShell 命令:

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

    **注意:**上述命令的输出包含当前偏移量的数值。例如,如果输出是 34,那么当前偏移量位于日志文件的第 34 个字节。当 CloudWatch 代理将新日志写入日志文件时,CloudWatch Logs 会从标识的字节处读取。

  3. 检查日志文件的大小值。<br id=hardline_break/> 对于 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 代理配置是否包含要监控的日志文件。
  • 确保日志文件具有正确的文件格式,并且您使用了正确的名称和位置。
  • 在当前配置中,检查是否已将日志配置为发送到您要从中检索数据的同一日志组和日志流。
  • 查看您在实例上监控的日志文件。检查源日志文件是否包含您要发布到日志组的数据。

force_flush_interval 值过高

如果日志大小达到 1MB 的最大缓冲区,则无论您设置的 force_flush_interval 时间间隔如何,CloudWatch 都会立即接收日志。有关更多信息,请选择 CloudWatch agent configuration file: Metrics section(CloudWatch 代理配置文件:指标部分)选项卡。

如果时间间隔设置的值过高,并且日志大小未达到 1MB,则日志将保留在缓冲区中。只有在缓冲区已满或时间间隔结束后,CloudWatch 代理才会向服务器发送日志。在此时间间隔内,日志在 CloudWatch 中不可用。确保将时间间隔值设置为正确的大小。最佳做法是根据日志大小和您希望发布日志的时间间隔来设置时间间隔值。

相关信息

CloudWatch 代理故障排除

如何对 Amazon Elastic Kubernetes Service (Amazon EKS) 中的容器组 (pod) 状态问题进行故障排除?

AWS 官方已更新 4 个月前