我无法使用 CloudWatch Logs 代理 (awslogs) 将日志数据推送到 Amazon CloudWatch Logs。
解决方法
在开始之前,请确认 awslogs 代理可以连接到 CloudWatch Logs API 端点。
确保您的配置具有以下属性:
- 互联网连接
- 有效的安全组配置
- 有效的网络访问控制列表(网络 ACL)
重要事项: 此参考适用于不再受支持的早期 CloudWatch Logs 代理。如果您使用实例元数据服务版本 2(IMDSv2),则必须使用新的统一 CloudWatch 代理。即使您没有使用 IMDSv2,也最好使用更新的统一 CloudWatch 代理而不是日志代理。
指纹识别问题
查看源日志文件的标题行。在配置要推送到 CloudWatch 的数据时,您可以设置此文件的路径。
- 如果前几行为空或包含保持不变的非事件数据,则日志识别哈希可能存在问题。
- 如果标题行相同,则更新代理配置文件中的 file_fingerprint_lines 选项。确保在每个文件中指定用于生成识别哈希的行。
检查 awslogs 日志文件中是否存在错误
查看 /var/log/awslogs.log 日志文件。确保记下所有错误消息。
权限错误包括:
- NoCredentialsError: 找不到凭证 – 如果您没有向实例添加 AWS Identity and Access Management(IAM)角色,请创建并附加 IAM 角色。如果您已经向实例添加 IAM 角色,请更新 /etc/awslogs/awscli.conf 文件中的 IAM 用户凭证。
- ClientError: 调用 PutLogEvents 操作时出错 (AccessDeniedException): 用户 arn:aws:iam::012345678910: / 无权执行 logs:PutLogEvents[...] – 为 IAM 角色或用户配置 CloudWatch Logs 所需的权限。
时间戳错误包括:
- 回退到之前的事件时间:{'timestamp': 1492395793000, 'start_position': 17280L, 'end_position': 17389L}, previousEventTime: 1492395793000,原因:无法从消息中解析时间戳。 – 确认日志事件以时间戳开头。检查 /etc/awslogs/awslogs.conf 中指定的 datetime_format 是否与日志事件的时间戳格式匹配。根据需要更改 datetime_format 以与时间戳格式匹配。
- **未找到具有给定路径 ' ' 的文件 ** – 将代理配置文件中的日志文件路径更新为正确的路径。
其他 awslogs 问题
- 如果日志轮换后日志停止推送,请检查支持的日志轮换方法。有关更多信息,请参阅 CloudWatch Logs 代理常见问题。
- 如果仅在 awslogs 代理重新启动后才短暂推送日志,请检查代理配置文件的 [logstream] 部分中是否存在重复内容。每个部分必须有唯一的名称。
- 如果 awslogs.log 日志文件占用过多的磁盘空间,请检查日志文件中是否存在错误,然后进行更正。如果日志文件仅包含信息性消息,则在代理配置文件中为 logging_config_file 选项指定较低的日志记录级别。
进一步的故障排除
要进一步进行故障排除,请记下 instance-id(您的实例的 ID)。然后,根据您的配置收集并查看以下内容。
Yum 安装:
$ yum info awslogs
$ yum info aws-cli-plugin-cloudwatch-logs
- /etc/awslogs/awslogs.conf 文件
- /etc/awslogs/awscli.conf 文件
- /etc/awslogs/ 中的其他相关文件
- /var/log/awslogs.log 文件
基于脚本的安装:
$ /var/awslogs/bin/awslogs-version.sh
- /var/awslogs/etc/awslogs.conf 文件
- /var/awslogs/etc/awscli.conf 文件
- /var/awslogs/etc/ 中的其他相关文件
- /var/log/awslogs.log
- /var/log/awslogs-agent-setup.log
对于轮换相关的问题,请收集并查看:
- 源日志的片段
- 监视目标目录的内容列表。使用带有目录路径的命令 ls-la 获取以下内容:
$ ls -la <Monitoring-Target-Directory-Path>
相关信息
CloudWatch 日志入门