如何将特定日志文件从多容器 Docker Elastic Beanstalk 流式传输到 CloudWatch?
Posted
技术标签:
【中文标题】如何将特定日志文件从多容器 Docker Elastic Beanstalk 流式传输到 CloudWatch?【英文标题】:How can I stream a specific log file from multi-container Docker Elastic Beanstalk to CloudWatch? 【发布时间】:2018-09-07 16:42:02 【问题描述】:我将 Web 服务部署到运行 Docker 多容器 堆栈的 Elastic Beanstalk 环境中。我在环境中启用了到 CloudWatch 的日志流,因此 Cloudwatch 中显示了大约五个不同的日志组,因此当我从 Beanstalk 中单击“请求日志”时,它会加载一个网页,一个接一个地显示所有日志文件。我注意到这个网页上有一些日志没有在 CloudWatch 中显示为日志组,这些是我真正关心的日志。我的问题是如何让它们显示为 CloudWatch 日志组?
具体来说,Elastic Beanstalk 自动为我创建的五个日志组是:
/aws/elasticbeanstalk/my-web-service/var/log/docker-events.log /aws/elasticbeanstalk/my-web-service/var/log/eb-activity.log /aws/elasticbeanstalk/my-web-service/var/log/eb-ecs-mgr.log /aws/elasticbeanstalk/my-web-service/var/log/ecs/ecs-agent.log /aws/elasticbeanstalk/my-web-service/var/log/ecs/ecs-init.log当我查看“请求日志”时生成的文件时,这五个确实在那里。但是这些其他日志文件也有表示:
/aws/elasticbeanstalk/my-web-service/var/log/awslogs.log /aws/elasticbeanstalk/my-web-service/var/log/docker /aws/elasticbeanstalk/my-web-service/var/log/docker-ps.log /aws/elasticbeanstalk/my-web-service/var/log/eb-commandprocessor.log /aws/elasticbeanstalk/my-web-service/var/log/containers/my-svc-8edcf9cec583-stdouterr.log这是我真正感兴趣的最后一个,以 stdouterr.log 结尾的那个。这就是我的容器化应用程序将其所有日志消息写入的地方。我希望看到的是 CloudWatch 中与该 stdouterr.log 文件相对应的日志组。据我所知,日志文件名中的 12 位 ID 是安装在主机上的 docker 映像的 ID,每次重新启动服务器时都会更改。所以我猜我可能需要在 Dockerrun.aws.json 配置中安装一个卷或类似的东西?此外,我猜想我需要手动将日志组添加到 CloudWatch?我怎样才能让这个文件显示出来?
【问题讨论】:
【参考方案1】:您目前似乎只有默认日志被发送到 Cloudwatch 日志。您可以通过 .ebextensions
向 cloudwatch 代理添加其他日志
### BEGIN .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
files:
"/etc/awslogs/config/stdout.conf":
mode: "000755"
owner: root
group: root
content: |
[docker-stdout]
log_group_name=/aws/elasticbeanstalk/environment_name/docker-stdout
log_stream_name=instance_id
file=/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log
commands:
"00_restart_awslogs":
command: service awslogs restart
### END .ebextensions/logs.config
source
【讨论】:
我终于开始尝试这个,但遗憾的是它没有效果。具体来说,我将我的 Dockerrun.aws.json 文件与 .ebextensions 文件夹压缩在一起,其中包含一个与此类似的文件。但是,Cloudwatch 中没有出现新的日志组。还有什么想法吗? 我还要注意,如果我通过 SSH 连接到支持 EB 的 EC2 实例,我可以看到确实创建了这个配置文件 (/etc/awslogs/config/stdout.conf
)。但是它似乎没有作用。
你检查过代理日志/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
也许它会给你更多关于失败的信息
想通了 - 实例配置文件角色无权推送到 Cloudwatch。当我添加它时,这开始起作用了。谢谢!
总是权限! :)以上是关于如何将特定日志文件从多容器 Docker Elastic Beanstalk 流式传输到 CloudWatch?的主要内容,如果未能解决你的问题,请参考以下文章