Cloudwatch 仅记录部署更新
Posted
技术标签:
【中文标题】Cloudwatch 仅记录部署更新【英文标题】:Cloudwatch logs only updates on deploy 【发布时间】:2020-11-28 21:26:50 【问题描述】:我在弹性豆茎上有一个容器。 这是一个 .net core 2.2 应用程序,使用运行 microsoft/dotnet:2.2-aspnetcore-runtime 的 docker 容器部署。
我一直在尝试将日志记录设置到 cloudwatch,然后我进入了 Elastic Beanstalk -> 环境 -> 我的环境 -> 配置 并启用“日志流”(禁用旋转日志)
我现在可以在 cloudwatch 中看到我的日志,并且我可以在以下位置看到来自我的应用程序的日志语句: /aws/elasticbeanstalk/my-environment/var/log/eb-docker/containers/eb-current-app/stdouterr.log
问题是,它们永远不会更新。唯一将更多数据放入日志的情况是,如果我重新部署应用程序(即使在 12 小时后,日志中仍然没有任何新内容)。
我尝试添加一个文件: .ebextensions/logs.config 的内容:
option_settings:
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: StreamLogs
value: true
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: DeleteOnTerminate
value: false
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: RetentionInDays
value: 7
但它是一样的。日志中的内容仅在我重新部署应用程序时更新。 其次,我遵循了这个: Elastic Beanstalk Single Container Docker - use awslogs logging driver
option_settings:
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: StreamLogs
value: true
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: DeleteOnTerminate
value: false
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: RetentionInDays
value: 14
files:
"/etc/awslogs/config/stdout.conf":
mode: "000755"
owner: root
group: root
content: |
[/var/log/containers/docker-stdout]
log_group_name=/aws/elasticbeanstalk/` "Ref" : "AWSEBEnvironmentName" `/docker-stdout.log
log_stream_name=instance_id
file=/var/log/containers/*-stdouterr.log
commands:
"00_restart_awslogs":
command: service awslogs restart
我错过了什么?网站上的流量不多,但日志不应该至少每 5 分钟更新一次吗?我一直在阅读有关 file_fingerprint_lines 并将 awslogs 设置为 docker 上的驱动程序的信息,但似乎无法让这些工作。
我对 EBS 或 Cloudwatch 没有太多经验,因此非常感谢任何帮助。问题之一是,我真的不知道去哪里调试这个
【问题讨论】:
你看到this的问题了吗?您还在 EB 上运行单 docker 还是多 docker 环境? 谢谢,我以前没见过这个答案。我今晚要试一试。这是一个单一的 docker 实例。 我已经取得了一些进展,或者至少,我对出了什么问题有了一些指示。我通过 SSH 进入实例,并开始查看日志。我可以看到 stderr 日志正在更新,但在我的 awslogs.log 中出现以下错误:cwlogs.push.stream - WARNING - 6563 - Thread-1 - No file is found with given path '/var/log/containers /*-stdouterr.log'。没有 /var/log/containers/ 文件夹,所以明天我会研究如何将其更改为正确的位置 【参考方案1】:我解决了这个问题,在我的 .config 文件中有这个:
option_settings:
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: StreamLogs
value: true
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: DeleteOnTerminate
value: false
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: RetentionInDays
value: 14
files:
"/etc/awslogs/config/stdout.conf":
mode: "000755"
owner: root
group: root
content: |
[/var/log/containers/docker-stdout]
log_group_name=/aws/elasticbeanstalk/` "Ref" : "AWSEBEnvironmentName" `/docker-stdout.log
log_stream_name=instance_id
file=/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log
答案本身实际上并不像我如何调试它那么有趣(在这里发布以防它对其他人有帮助):
-
使用
eb ssh
SSH 进入实例
找到日志:/var/log/awslogs.log 并看到错误:cwlogs.push.stream - WARNING - 6563 - Thread-1 - No file is found with given path '/var/log/containers/*-stdouterr.log'
我按照路径 (/var/log/containers) 发现文件夹结构不存在。从发送到 cloudwatch 的日志中,我可以看到路径是:/var/log/eb-docker/containers/eb-current-app/
,我检查并找到了日志文件。
从我一直在阅读的其他一些问题中,我可以看到 awslogs 的配置(即向 aws 发送输出的代理)位于:/etc/awslogs/config/stdout.conf
。查看这个文件,我看到了路径/var/log/containers/*-stdouterr.log
我将路径更改为/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log
并重新启动了awslogs 服务sudo service awslogs restart
现在我可以看到正在更新的日志。 为什么它在部署时确实将日志发送到 cloudwatch,我不知道,但以上解决了问题
【讨论】:
以上是关于Cloudwatch 仅记录部署更新的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS 中缩减 Auto Scaling 组会导致永久警报
sh 使用CloudWatch事件规则触发器部署Lambda函数