24

如何将自定义日志添加到 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 一样,这些自定义日志现在被跟踪或从控制台或 Web 检索,这很好,但它们不会持久存在并且不会在 CloudWatch 上发送。

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

4

5 回答 5

32

bundlelogs.d和taillogs.d都是从管理控制台检索的日志您想要做的是将默认日志(例如 eb-activity.log)扩展到 CloudWatch Logs。为了扩展日志流,您需要在/etc/awslogs/config/. 配置应遵循代理配置文件格式

我已经成功地为我的自定义 ubuntu/nginx/php 平台扩展了我的日志。这是我的扩展文件仅供参考。这是一个官方样本仅供参考。

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

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*
于 2017-06-08T08:36:33.473 回答
14

应归功于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

日志组名

我们的 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*
于 2018-01-26T22:23:54.867 回答
6

代理在配置文件中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"

在此配置中,我根据 NODE_ENV 从 S3 存储桶中获取适当的配置文件。你可以在你的配置中做任何你想做的事情。

于 2017-06-06T19:15:59.373 回答
1

这里已经有一些很好的答案。

我在一个新的Medium 博客中详细介绍了这一切是如何工作的,以及一个示例 .ebextensions 文件以及放置它的位置。

以下是您可能可以使用的摘录,该文章解释了如何确定要流式传输的正确文件夹/文件。

请注意,如果 /var/app/current/logs/* 包含许多不同的文件,这可能不起作用,例如,如果您有

database.log app.log random.log

然后你应该考虑为每个添加一个流,但是如果你有

app.2021-10-18.log app.2021-10-17.log app.2021-10-16.log

然后你可以使用 /var/app/current/logs/app.*

packages:
  yum:
    awslogs: []

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: 90

files:
  "/etc/awslogs/awscli.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
      [plugins]
      cwlogs = cwlogs
      [default]
      region = `{"Ref":"AWS::Region"}`

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

commands:
  "01":
    command: systemctl enable awslogsd.service
  "02":
    command: systemctl restart awslogsd
于 2021-10-18T15:26:57.893 回答
0

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

(我们的环境是 Amazon Linux AMI - Ruby 2.6 Puma 平台上的 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设置一个高数字,使其成为部署期间运行的最后一个扩展文件。0x09_setup_stream_to_cloudwatch.config

然后,提供以下内容,替换your_log_file为适当的文件名,请记住,一些日志文件存在于/var/logAmazon Linux AMI 中,而一些(例如由您的应用程序生成的)可能存在于以下路径中/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`

部署您的应用程序,您应该已准备就绪!

于 2020-09-02T19:49:35.830 回答