AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

将 Elastic Beanstalk 用于 Amazon CloudWatch Logs

利用 CloudWatch Logs,您可以监控和存档您的环境的 Amazon EC2 实例中的 Elastic Beanstalk 应用程序、系统和自定义日志文件。您还可以配置警报,这些警报使您更容易根据指标筛选器提取的特定日志流事件做出响应。在环境中每个 Amazon EC2 实例上安装的 CloudWatch Logs 代理会针对您配置的每个日志组,将指标数据点发布到 CloudWatch 服务。每个日志组都应用自己的筛选模式,以确定要作为数据点发送到 CloudWatch 的日志流事件。属于同一日志组的各日志流具有相同的保留、监控和访问控制设置。您可以配置 Elastic Beanstalk 以自动将日志流式传输到 CloudWatch 服务,如将实例日志流式传输到 CloudWatch Logs 中所述。有关 CloudWatch Logs 的更多信息(包括术语和概念),请参阅 Amazon CloudWatch Logs 用户指南

除了实例日志之外,如果您为环境启用增强型运行状况,则可以将环境配置为将运行状况信息流式传输至 CloudWatch Logs。请参阅 将 Elastic Beanstalk 环境运行状况信息流式传输到 Amazon CloudWatch Logs

下图显示了配置有 CloudWatch Logs 集成的环境的 Monitoring (监控) 页面和图表。此环境中的示例指标名为 CWLHttp4xxCWLHttp5xx。其中一个图表显示了 CWLHttp4xx 指标根据配置文件指定的条件触发了警报。

下图显示了名为 AWSEBCWLHttp4xxPercentAlarmAWSEBCWLHttp5xxCountAlarm 的示例警报(分别对应于 CWLHttp4xxCWLHttp5xx 指标)的 Alarms (警报) 页面和图表。

实例日志流式传输到 CloudWatch Logs 的先决条件

要启用日志从环境的 Amazon EC2 实例流式传输到 CloudWatch Logs,您必须满足以下条件。

  • 平台 – 由于此功能仅在此版本时或之后发布的平台配置中可用,因此,如果您使用的是早期平台配置,请将环境更新为当前环境。

  • 如果您的 Elastic Beanstalk 实例配置文件中没有 AWSElasticBeanstalkWebTierAWSElasticBeanstalkWorkerTier Elastic Beanstalk 托管策略,则您必须向配置文件中添加以下内容来启用此功能。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogStream" ], "Resource": [ "*" ] } ] }

Elastic Beanstalk 如何设置 CloudWatch Logs

Elastic Beanstalk 会在其创建的每个实例上安装一个具有默认配置设置的 CloudWatch 日志代理。在 CloudWatch Logs 代理参考中了解更多信息。

当您启用实例日志流式传输到 CloudWatch Logs 时,Elastic Beanstalk 会将日志文件从您的环境的实例发送至 CloudWatch Logs。不同的平台将流式传输不同的日志。下表按平台列出了日志。

平台

日志

Docker

  • /var/log/eb-activity.log

  • /var/log/nginx/error.log

  • /var/log/docker-events.log

  • /var/log/docker

  • /var/log/nginx/access.log

  • /var/log/eb-docker/containers/eb-current-app/stdouterr.log

Multi-Docker(generic)

  • /var/log/eb-activity.log

  • /var/log/ecs/ecs-init.log

  • /var/log/eb-ecs-mgr.log

  • /var/log/ecs/ecs-agent.log

  • /var/log/docker-events.log

Glass fish (Preconfigured Docker)

  • /var/log/eb-activity.log

  • /var/log/nginx/error.log

  • /var/log/docker-events.log

  • /var/log/docker

  • /var/log/nginx/access.log

Go (Preconfigured Docker)

  • /var/log/eb-activity.log

  • /var/log/nginx/error.log

  • /var/log/docker-events.log

  • /var/log/docker

  • /var/log/nginx/access.log

Python (Preconfigured Docker)

  • /var/log/eb-activity.log

  • /var/log/nginx/error.log

  • /var/log/docker-events.log

  • /var/log/docker

  • /var/log/nginx/access.log

Go

  • /var/log/eb-activity.log

  • /var/log/nginx/error.log

  • /var/log/nginx/access.log

Java

  • /var/log/eb-activity.log

  • /var/log/nginx/access.log

  • /var/log/nginx/error.log

  • /var/log/web-1.error.log

  • /var/log/web-1.log

Tomcat

  • /var/log/eb-activity.log

  • /var/log/httpd/error_log

  • /var/log/httpd/access_log

  • /var/log/nginx/error_log

  • /var/log/nginx/access_log

.NET on Windows Server

  • C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log

  • C:\Program Files\Amazon\ElasticBeanstalk\logs\AWSDeployment.log

  • C:\Program Files\Amazon\ElasticBeanstalk\logs\Hooks.log

Node.js

  • /var/log/eb-activity.log

  • /var/log/nodejs/nodejs.log

  • /var/log/nginx/error.log

  • /var/log/nginx/access.log

  • /var/log/httpd/error.log

  • /var/log/httpd/access.log

PHP

  • /var/log/eb-activity.log

  • /var/log/httpd/error_log

  • /var/log/httpd/access_log

Python

  • /var/log/eb-activity.log

  • /var/log/httpd/error_log

  • /var/log/httpd/access_log

  • /opt/python/log/supervisord.log

Ruby (Puma)

  • /var/log/eb-activity.log

  • /var/log/nginx/error.log

  • /var/log/puma/puma.log

  • /var/log/nginx/access.log

Ruby (Passenger)

  • /var/log/eb-activity.log

  • /var/app/support/logs/passenger.log

  • /var/app/support/logs/access.log

  • /var/app/support/logs/error.log

Elastic Beanstalk 针对其流式传输的各种日志文件在 CloudWatch Logs 中配置日志组。要从 CloudWatch Logs 中检索特定日志文件,您必须知道相应日志组的名称。日志组命名方案取决于平台的操作系统。

对于 Linux 平台,为实例上日志文件位置加上前缀 /aws/elasticbeanstalk/environment_name 以获得日志组名称。例如,要检索文件 /var/log/nginx/error.log,请指定日志组 /aws/elasticbeanstalk/environment_name/var/log/nginx/error.log

有关 Windows 平台,请参阅下表以了解每个日志文件对应的日志组。

实例上日志文件

日志组

C:\Program Files\Amazon\ElasticBeanstalk\logs\AWSDeployment.log

/aws/elasticbeanstalk/<environment-name>/EBDeploy-Log

C:\Program Files\Amazon\ElasticBeanstalk\logs\Hooks.log

/aws/elasticbeanstalk/<environment-name>/EBHooks-Log

C:\inetpub\logs\LogFiles (整个目录)

/aws/elasticbeanstalk/<environment-name>/IIS-Log

将实例日志流式传输到 CloudWatch Logs

您可以使用 Elastic Beanstalk 控制台、EB CLI 或配置选项启用实例日志流式传输到 CloudWatch Logs。

使用 Elastic Beanstalk 控制台进行实例日志流式传输

将实例日志流式传输到 CloudWatch Logs

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

  5. Instance log streaming to CloudWatch Logs (实例日志流式传输到 CloudWatch Logs) 下:

    • 启用 Log streaming (日志流式传输)

    • Retention (保留) 设置为保存日志的天数。

    • 选择 Lifecycle (生命周期) 设置,该设置确定日志是否在环境终止时进行保存。

  6. 选择 Apply

下图中的示例将日志保存 7 天并且在终止环境后保留日志。

在启用日志流式传输后,您可以返回到软件配置卡或页面并查找日志组链接。单击此链接可在 CloudWatch 控制台中查看您的日志。

使用 EB CLI 进行实例日志流式传输

要使用 EB CLI 启用实例日志流式传输到 CloudWatch Logs,请使用 eb logs 命令。

$ eb logs --cloudwatch-logs enable

您也可以使用 eb logs 来检索 CloudWatch Logs 中的日志。您可以检索环境的所有实例日志,也可以使用该命令的多个选项来指定要检索的日志的子集。例如,以下命令检索您的环境中一组完整的实例日志,并且将它们保存到 .elasticbeanstalk/logs 下的目录。

$ eb logs --all

具体而言,--log-group 选项可让您检索特定日志组的实例日志,对应于特定实例上日志文件。为此,您需要了解对应于要检索的日志文件的日志组的名称。您可以在 Elastic Beanstalk 如何设置 CloudWatch Logs 中找到此信息。

使用配置文件进行日志流式传输

在创建或更新环境时,您可以使用配置文件来设置和配置实例日志流式传输到 CloudWatch Logs。您出可以配置自定义日志文件的流式传输。要使用下列每个示例,请将该文本复制到应用程序源包的顶层 .config 目录中扩展名为 .ebextensions 的文件。您可以单独使用每个示例,也可以将它们合并到单个配置文件中。

以下示例配置文件启用默认实例日志流式传输。Elastic Beanstalk 为您的环境平台流式传输一组默认日志文件。

option_settings: - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: StreamLogs value: true

以下示例配置文件配置您的应用程序生成的自定义日志文件的流式传输。该示例将您的环境实例上的 CloudWatch Logs 代理配置为将每组日志文件流式传输到以日志文件命名的 CloudWatch Logs 日志组中,以便轻松进行检测和检索。

注意

Elastic Beanstalk 在 Windows 平台上不支持自定义日志文件流式传输。此示例仅适用于 Linux 环境。

files: "/etc/awslogs/config/customlogs.conf": mode: "000600" owner: root group: root content: | [stdouterr.log] log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/eb-docker/containers/eb-current-app/stdouterr.log"]]}` log_stream_name = {instance_id} file = /var/log/eb-docker/containers/eb-current-app/*stdouterr.log* file_fingerprint_lines=1-8 [sample-app.log] log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/eb-docker/containers/eb-current-app/sampleapp.log"]]}` log_stream_name = {instance_id} file = /var/log/eb-docker/containers/eb-current-app/sample-app.log* file_fingerprint_lines=1-8 commands: "01": command: chkconfig awslogs on "02": command: service awslogs restart

有关配置 CloudWatch Logs 的更多信息,请参阅 Amazon CloudWatch Logs User Guide 中的 CloudWatch Logs 代理参考

必须先设置与 CloudWatch Logs 代理结合使用的 IAM 权限,然后才能使用配置文件配置与 CloudWatch Logs 的集成。您可以将以下自定义策略挂载到分配给您的环境的实例配置文件

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:GetLogEvents", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:PutRetentionPolicy" ], "Resource": [ "*" ] } ] }

CloudWatch Logs 集成问题排查

如果您无法在 CloudWatch Logs 中找到所期望的环境的一些实例日志,则可以调查以下常见问题:

  • 您的 IAM 角色缺少所需 IAM 权限。

  • 您在不支持 CloudWatch Logs 的 AWS 区域中启动了您的环境。

  • 您的其中一个自定义日志文件不存在于您指定的路径中。