【问题标题】:Elastic Beanstalk Docker with Amazon CloudWatch带有 Amazon CloudWatch 的 Elastic Beanstalk Docker
【发布时间】:2016-07-26 20:57:30
【问题描述】:

我有一个使用 Docker 容器部署的 Elastic Beanstalk 应用程序。应用程序本身就是一个 Java 应用程序。

我的目标是将日志发送到 Cloudwatch。特别是我想将 stdouterr.log 文件获取到 Cloudwatch。该文件可以在/var/log/eb-docker/containers/eb-current-app/*下找到

我关注了 AWS 官方文档 here。 根据示例配置文件,我设法将 nginx Webrequest 发送到 Cloudwatch。

对于 EB docker stdouterr 日志,我将 cwl-log-setup.config 文件修改为以下内容:

Mappings:
  CWLogs:
    ApplicationLogGroup:
      LogFile: "/var/log/eb-docker/containers/eb-current-app/*"
      TimestampFormat: "%d/%b/%Y:%H:%M:%S %z"

Outputs:
  ApplicationLogGroup:
    Description: "The name of the Cloudwatch Logs Log Group created for this environments web server access logs. You can specify this by setting the value for the environment variable: WebRequestCWLogGroup. Please note: if you update this value, then you will need to go and clear out the old cloudwatch logs group and delete it through Cloudwatch Logs."
    Value: { "Ref" : "AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0WebRequestLogGroup"}


Resources :
  AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0WebRequestLogGroup:    ## Must have prefix:  AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0
    Type: "AWS::Logs::LogGroup"
    DependsOn: AWSEBBeanstalkMetadata
    DeletionPolicy: Retain     ## this is required
    Properties:
      LogGroupName:
        "Fn::GetOptionSetting":
          Namespace: "aws:elasticbeanstalk:application:environment"
          OptionName: ApplicationLogGroup
          DefaultValue: {"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "webrequests"]]}
      RetentionInDays: 14

cloudwatch 日志组已创建,但没有日志到达。我遗漏了哪些步骤或我的配置文件有什么问题?

【问题讨论】:

    标签: amazon-web-services docker amazon-elastic-beanstalk amazon-cloudwatch


    【解决方案1】:

    现在可以在 Amazon Linux 2 的 docker 平台上使用 docker-compose.yaml:

    version: '3.8'
    services:
      your-service:
        logging:
          driver: awslogs
          options:
            awslogs-group: "${your-log-group-name}"
            awslogs-region: "us-west-2"
    

    更多选项请参见此处: https://docs.docker.com/config/containers/logging/awslogs/

    【讨论】:

      【解决方案2】:

      我为每个 ElasticBeanstalk 应用程序创建 Dockerrun 文件。 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_image.html

      您可以在此处指定日志记录配置:

                 "logConfiguration": {
                      "logDriver": "awslogs",
                      "options": {
                          "awslogs-group": "${you-log-group-name}",
                          "awslogs-region": "${region}",
                          "awslogs-stream-prefix": "${serviceName}"
                      }
                  }
      

      这将设置 Docker 的日志记录驱动程序配置 更多细节: https://docs.docker.com/config/containers/logging/configure/

      【讨论】:

      • 此配置目前仅适用于多个docker容器
      • 现在可以在 Amazon Linux 2 的 docker 平台上使用 docker-compose.yaml: `` version: '3.8' services: your-service: logging: driver: awslogs options: awslogs-group: "${your-log-group-name}" awslogs-region: "us-west-2" ```
      【解决方案3】:

      我刚刚遇到了同样的问题 - 我设法通过将 LogFile 配置更改为来获取日志文件

      Mappings:
        CWLogs:
          WebRequestLogGroup:
            LogFile: "/var/log/eb-docker/containers/eb-current-app/*.log"
            TimestampFormat: "%d/%b/%Y:%H:%M:%S %z"
      

      请注意,这仅适用于存在单个日志文件的情况,如果您重新部署容器或应用配置更改导致此目录中有多个日志,那么只有日志文件中具有最新修改时间的事件才会由 awslogs 代理处理

      默认情况下,代理将比较日志文件的第一行以确定它是否是不同的文件,如果第一行相同,它将忽略它。您可以通过添加 file_fingerprint_lines 配置来指定代理用于对文件进行指纹识别的行,

      例如使用第 1 - 20 行来识别文件:

      AWSEBAutoScalingGroup:
          Metadata:
            "AWS::CloudFormation::Init":
              CWLogsAgentConfigSetup:
                files:
                  ## any .conf file put into /tmp/cwlogs/conf.d will be added to the cwlogs config (see cwl-agent.config)
                  "/tmp/cwlogs/conf.d/apache-access.conf":
                    content : |
                  [    apache-access_log]
                      file = `{"Fn::FindInMap":["CWLogs", "WebRequestLogGroup", "LogFile"]}`
                      log_group_name = `{ "Ref" : "AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0WebRequestLogGroup" }`
                      file_fingerprint_lines = 1-20
                      log_stream_name = {instance_id}
                      datetime_format = `{"Fn::FindInMap":["CWLogs", "WebRequestLogGroup", "TimestampFormat"]}`
                    mode  : "000400"
                    owner : root
                    group : root
      

      【讨论】:

      • 你知道是否有解决方法吗?
      • 我后来发现这是不正确的,将日志文件事件推送到 CloudWatch 的 awslogs 代理将使用最新最后修改时间的文件,我将编辑答案
      • 您的意思是在部署后日志现在会继续吗?
      • 是的,它将继续
      • 我发现我的情况并非如此。我从初始部署中获取日志,但不是从后续更新中获取。有什么建议吗?
      猜你喜欢
      • 2017-12-04
      • 2014-11-08
      • 2017-11-05
      • 2017-06-06
      • 2014-05-21
      • 2018-10-13
      • 2014-12-13
      • 2022-07-23
      • 2014-12-15
      相关资源
      最近更新 更多