如何将特定日志文件从多容器 Docker Elastic Beanstalk 流式传输到 CloudWatch?

How can I stream a specific log file from multi-container Docker Elastic Beanstalk to CloudWatch?

我将 Web 服务部署到 Elastic Beanstalk 环境 运行 Docker Multi-Container 堆栈。我在环境中启用了到 CloudWatch 的日志流,因此 Cloudwatch 中会显示大约五个不同的日志组,因此当我从 Beanstalk 单击 "Request Logs" 时,它会加载一个网页,一个接一个地显示所有日志文件。我注意到此网页上有一些日志没有在 CloudWatch 中显示为日志组,而这些是我真正关心的日志。我的问题是如何让它们显示为 CloudWatch 日志组?

特别是,Elastic Beanstalk 自动为我创建的五个日志组是:

当我查看 "request logs," 时生成的文件时,这五个文件确实存在。但这些其他日志文件也表示:

这是我真正感兴趣的最后一个,以 stdouterr.log 结尾的那个。这是我的容器化应用程序将其所有日志消息写入的位置。我希望看到的是 CloudWatch 中与该 stdouterr.log 文件相对应的日志组。据我所知,日志文件名中的 12 位 ID 是安装在主机上的 docker 图像的 ID,每次重新启动服务器时都会更改。所以我猜我可能需要在 Dockerrun.aws.json 配置中安装卷或类似的东西?而且我猜想我需要手动将日志组添加到 CloudWatch?我怎样才能让这个文件显示出来?

您目前似乎只有默认日志被发送到 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