如何将特定日志文件从多容器 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?的主要内容,如果未能解决你的问题,请参考以下文章

Docker:如何正确清除 Docker 容器的日志?

将日志输出到Docker容器外

对docker容器产生的日志做轮转

从多项目点网核心解决方案构建 Docker 映像

如何找到Docker日志?

如何将日志从 docker 容器转发到主机 journald/syslog 服务?