在 cloudwatch 日志中添加指标

adding metric in cloudwatch log

Elastic Beanstalk 默认在五个文件中生成日志。当启用 cloudwatch 流式日志时,它显示 error.log access.log、eb.log。但我还想在 cloudwatch 日志中记录 catilina.out 日志或 tomcat 日志。怎么做?

您可以使用额外的配置文件将您自己的日志添加到 Cloudwatch:

/etc/awslogs/config/awslogs.conf

例如,我使用以下文件将应用程序的所有 laravel 日志传输到 cloudwatch:

[laravel.log]
file = /var/www/html/storage/logs/laravel*
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = prod-laravel
multi_line_start_pattern = {datetime_format}

添加或更新文件时,一定要重新启动 awslogs 守护进程。

可以在 https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html 找到更多信息。

我在新的 Medium blog 中详细介绍了这一切的工作原理以及示例 .ebextensions 文件以及放置位置。

总而言之,您需要设置一个策略,将其附加到 Elastic Beanstalk EC2 角色,将 .ebextensions 文件添加到您的应用程序并确保文件引用完全您要流式传输的正确路径和文件名。

以下是您可能可以使用的摘录,该文章解释了如何查找和验证正确的 folder/file(s) 进行流式传输。

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/log/tomcat/localhost.log]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/localhost.log"]]}`
      log_stream_name = {instance_id}
      file = /var/log/tomcat/localhost.*

      [/var/log/tomcat/catalina.log]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/catalina.log"]]}`
      log_stream_name = {instance_id}
      file = /var/log/tomcat/catalina.*

      [/var/log/tomcat/localhost_access_log.txt]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/access_log"]]}`
      log_stream_name = {instance_id}
      file = /var/log/tomcat/access_log.*

commands:
  "01":
    command: systemctl enable awslogsd.service
  "02":
    command: systemctl restart awslogsd