docker - Cloudwatch 仅记录部署更新
问题描述
我在弹性豆茎上有一个容器。这是一个 .net core 2.2 应用程序,使用运行 microsoft/dotnet:2.2-aspnetcore-runtime 的 docker 容器部署。
我一直在尝试将日志记录设置到 cloudwatch,然后我进入 Elastic Beanstalk -> Environments -> my-environment -> Configuration 并启用了“日志流”(禁用了旋转日志)
我现在可以在 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 没有太多经验,因此非常感谢任何帮助。问题之一是,我真的不知道在哪里寻找调试这个
解决方案
我通过在我的 .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
答案本身实际上并不像我如何调试它那么有趣(发布在这里以防它对其他人有帮助):
- 使用 SSH 进入实例
eb 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,我不知道,但以上解决了问题
推荐阅读
- vue.js - 如何将动态内容传递给 Vue v-bind:@mousemove 方法上的样式
- nginx - 代理到另一个运行 Jenkins 的 NGINX 服务器
- c++ - 如何在继承中使用 std::list?
- firebase - 使用 Firebase 的最新稳定 Flutter 版本是什么?
- python - 如何使用 boto3 中的 put_item 方法将 dict 列表添加到 DynamoDB
- matlab - 在 Matlab 中计算给定类的 F1 分数
- python - scipy.interpolate.interp1d 折叠图
- jupyter-lab - 将 Ubuntu 18.04 升级到 20.04 并且 JupyterLab 不会尊重我的配置文件
- google-chrome - Heroku 无法识别 Watir 的更新配置变量,也不确定配置变量是否指向正确的 chrome 文件
- python - 用龙格-库塔法求解运动微分方程