AWS Elastic Beanstalk:将自定义日志添加到CloudWatch?

时间:2017-05-18 15:49:09

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

如何将自定义日志添加到CloudWatch?发送默认日志,但如何添加自定义日志?

我已经添加了这样的文件:(在.ebextensions中)

files:
  "/opt/elasticbeanstalk/tasks/bundlelogs.d/applogs.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/app/current/logs/*

  "/opt/elasticbeanstalk/tasks/taillogs.d/cloud-init.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/app/current/logs/*

正如我所做的bundlelogs.d和taillogs.d这些自定义日志现在已经从控制台或网络中添加或检索,这很好但是它们不会持续存在且不会在CloudWatch上发送。

在CloudWatch中,我有默认日志,如
 /aws/elasticbeanstalk/InstanceName/var/log/eb-activity.log
我想要另一个像这样的人 /aws/elasticbeanstalk/InstanceName/var/app/current/logs/mycustomlog.log

4 个答案:

答案 0 :(得分:24)

bundlelogs.d taillogs.d 都是从管理控制台检索的日志。您要做的是将默认日志(例如eb-activity.log)扩展到CloudWatch Logs。要扩展日志流,您需要在/etc/awslogs/config/下添加其他配置。配置应遵循Agent Configuration file Format

我已成功扩展我的自定义ubuntu / nginx / php平台的日志。这是我的extension file FYI。这是一个official sample FYI。

在你的情况下,它可能就像

files:
  "/etc/awslogs/config/my_app_log.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
      [/var/app/current/logs/xxx.log]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/logs/xxx.log"]]}`
      log_stream_name = {instance_id}
      file = /var/app/current/logs/xxx.log*

答案 1 :(得分:11)

到期的信用点Sebastian HsuAbhyudit Jain

对于我们的特定用例,这是我为config提出的最终.ebextensions文件。解释某些方面的注释在代码块下面。

files:
  "/etc/awslogs/config/beanstalklogs_custom.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
      [/var/log/tomcat8/catalina.out]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Fn::Select" : [ "1", { "Fn::Split" : [ "-", { "Ref":"AWSEBEnvironmentName" } ] } ] }, "var/log/tomcat8/catalina.out"]]}`
      log_stream_name = `{"Fn::Join":["--", [{ "Ref":"AWSEBEnvironmentName" }, "{instance_id}"]]}`
      file = /var/log/tomcat8/catalina.out*

services:
  sysvinit:
    awslogs:
      files:
        - "/etc/awslogs/config/beanstalklogs_custom.conf"

commands:
  rm_beanstalklogs_custom_bak:
    command: "rm beanstalklogs_custom.conf.bak"
    cwd: "/etc/awslogs/config"
    ignoreErrors: true

log_group_name

我们的EB环境有一个标准的命名方案,正好是environmentName-environmentType。我正在使用{ "Fn::Split" : [ "-", { "Ref":"AWSEBEnvironmentName" } ] }将其拆分为两个字符串(名称和类型)的数组。

然后我使用{ "Fn::Select" : [ "1", <<SPLIT_OUTPUT>> ] }来获取类型字符串。您的需求明显不同,因此您可能只需要以下内容:

      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat8/catalina.out"]]}`

log_stream_name

我正在使用Fn::Join函数将EB环境名称与实例ID连接起来。请注意,实例ID模板是一个完全按给定方式回显的字符串。

服务

部署自定义awslogs文件时,conf服务会自动重启。

命令

files块覆盖现有文件时,它会创建一个备份文件,如beanstalklogs_custom.conf.bak。此块会删除该备份文件,因为awslogs服务会读取两个文件,从而可能导致冲突。

结果

如果您登录EC2实例并sudo cat该文件,您应该看到类似这样的内容。请注意,所有Fn函数都已解决。如果发现Fn函数未解析,请检查它是否存在语法错误。

[/var/log/tomcat8/catalina.out]
log_group_name = /aws/elasticbeanstalk/environmentType/var/log/tomcat8/catalina.out
log_stream_name = environmentName-environmentType--{instance_id}
file = /var/log/tomcat8/catalina.out*

答案 2 :(得分:5)

awslogs代理在配置文件中查找它应该发送的日志文件。它有一些默认值。您需要对其进行编辑并指定文件。

您可以检查和编辑位于以下位置的配置文件:

/etc/awslogs/awslogs.conf

确保重启服务:

sudo service awslogs restart

您可以在那里指定自己的文件并创建不同的组,而不是。

请参阅以下链接,您将能够立即获取日志。

资源:

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html

编辑:

由于您不想编辑实例上的文件,因此可以将相关代码添加到代码根目录中的.ebextensions文件夹中。例如,这是我的01_cloudwatch.config

packages:
  yum:
    awslogs: []

container_commands:
  01_get_awscli_conf_file:
    command: "aws s3 cp s3://project/awscli.conf /etc/awslogs/awscli.conf"
  02_get_awslogs_conf_file:
    command: "aws s3 cp s3://project/awslogs.conf.${NODE_ENV} /etc/awslogs/awslogs.conf"
  03_restart_awslogs:
    command: "sudo service awslogs restart"
  04_start_awslogs_at_system_boot:
    command: "sudo chkconfig awslogs on"

在此配置中,我将从S3存储桶中取出相应的配置文件,具体取决于NODE_ENV。您可以在配置中执行任何操作。

答案 3 :(得分:0)

看一下AWS文档并不是很明显,但是您需要做一些事情。

(我们的环境是Ruby 2.6 Puma平台上的Amazon Linux AMI-Rails应用)。

首先,在IAM中创建一个策略,以使您的EB生成的EC2实例可以使用CloudWatch日志组并将其流式传输-我​​们将其命名为“ EB-Cloudwatch-LogStream-Access”。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*:log-stream:*"
        }
    ]
}

创建此文件后,请确保将策略附加到(与IAM>角色中)与您的EB环境关联的 IAM实例配置文件服务角色 (请检查环境的配置页面:“配置”>“安全性”>“ IAM实例配置文件” |“服务角色”)。

然后,在.config目录中提供.ebextensions文件,例如setup_stream_to_cloudwatch.config0x_setup_stream_to_cloudwatch.config。在我们的项目中,通过为.config设置较高的数字(例如0x),使其成为部署期间运行的最后一个扩展名09_setup_stream_to_cloudwatch.config文件。

然后,提供以下内容,用适当的文件名替换your_log_file,请记住,一些日志文件位于Amazon Linux AMI上的/var/log中,而另一些(例如由您的应用程序生成的文件)可能位于/var/app/current/log之类的路径中:

files:
  '/etc/awslogs/config/logs.conf':
    mode: '000600'
    owner: root
    group: root
    content: |
      [/var/app/current/log/your_log_file.log]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/log/your_log_file.log"]]}`
      log_stream_name = {instance_id}
      file = /var/app/current/log/your_log_file.log*
commands:
  "01":
    command: chkconfig awslogs on
  "02":
    command: service awslogs restart # note that this works for Amazon Linux AMI only - other Linux instances likely use `systemd`

部署您的应用程序,您应该已经设置好!