首页 > 解决方案 > 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 没有太多经验,因此非常感谢任何帮助。问题之一是,我真的不知道在哪里寻找调试这个

标签: dockeramazon-elastic-beanstalkamazon-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

答案本身实际上并不像我如何调试它那么有趣(发布在这里以防它对其他人有帮助):

  1. 使用 SSH 进入实例eb ssh
  2. 找到日志:/var/log/awslogs.log 并看到错误:cwlogs.push.stream - WARNING - 6563 - Thread-1 - No file is found with given path '/var/log/containers/*-stdouterr.log'
  3. 我按照路径(/var/log/containers)发现文件夹结构不存在。从发送到 cloudwatch 的日志中,我可以看到路径是:/var/log/eb-docker/containers/eb-current-app/我检查并找到了日志文件。
  4. 从我一直在阅读的其他一些问题中,我可以看到 awslogs 的配置(即向 aws 发送输出的代理)位于:/etc/awslogs/config/stdout.conf. 查看这个文件,我看到了路径/var/log/containers/*-stdouterr.log
  5. 我更改了路径/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log并重新启动了 awslogs 服务sudo service awslogs restart

现在我可以看到正在更新的日志。为什么它确实在部署时将日志发送到 cloudwatch,我不知道,但以上解决了问题


推荐阅读