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

从 Elastic Beanstalk 环境的 Amazon EC2 实例查看日志

Elastic Beanstalk 环境中的 Amazon EC2 实例会生成日志,您可以查看这些日志来对应用程序或配置文件进行故障排除。由 Web 服务器、应用程序服务器、Elastic Beanstalk 平台脚本和 AWS CloudFormation 创建的日志将存储在单个实例本地。您可使用环境管理控制台或 EB CLI 轻松检索这些日志。您还可以将环境配置为将日志实时流式传输到 Amazon CloudWatch Logs。

结尾日志是最常用日志文件的后 100 行,最常用日志文件有 Elastic Beanstalk 操作日志和来自 Web 服务器和/或应用程序服务器的日志。当您使用环境管理控制台或 eb logs 请求结尾日志时,环境中的一个实例会将最新的日志条目连接为一个文本文件,并将其上传到 Amazon S3。

捆绑日志是包含更多日志文件的完整日志,包括来自 yum 和 cron 的日志以及一些来自 AWS CloudFormation 的日志。当您请求捆绑日志时,环境中的一个实例会将完整日志文件打包为一个 ZIP 文档并上传到 Amazon S3。

注意

Elastic Beanstalk Windows Server 平台不支持捆绑日志。

要将已轮换的日志上传到 Amazon S3,环境中的实例必须有一个实例配置文件,并且具有向您的 Elastic Beanstalk Amazon S3 存储桶写入的权限。这些权限包含在默认实例配置文件中,当您在 Elastic Beanstalk 控制台中首次启动环境时,Elastic Beanstalk 会提示您创建默认实例配置文件。

要在环境管理控制台中检索日志,请导航到 Logs (日志),选择 Request Logs (请求日志),然后选择要检索的日志类型。要检索结尾日志,请选择 Last 100 Lines (最后 100 行)。要检索捆绑日志,请选择 Full Logs (完整日志)


      Elastic Beanstalk 控制台的日志页面

当 Elastic Beanstalk 检索完日志后,选择 Download (下载)

Elastic Beanstalk 将结尾和捆绑日志存储在 Amazon S3 存储桶中,并生成可用于访问日志的预签名 Amazon S3 URL。Elastic Beanstalk 将在持续 15 分钟后从 Amazon S3 中删除文件。

警告

拥有该预签名 Amazon S3 URL 的任何人都可以在这些文件被删除之前访问这些文件。只能将该 URL 提供给可信方。

要保留日志,您可以将环境配置为在日志轮换后自动将它们发布到 Amazon S3。要启用到 Amazon S3 的日志轮换,请按照配置实例日志查看中的过程操作。环境中的实例会尝试每小时上传一次已轮换的日志。

如果应用程序不是在环境平台默认配置的位置生成日志,可以使用配置文件 (.ebextensions) 扩展默认配置。您可以将应用程序的日志文件添加到结尾日志、捆绑日志或日志轮换中。

要实现实时日志流和长期存储,请将您的环境配置为将日志流式传输到 Amazon CloudWatch Logs

日志在实例上的位置

日志存储在您环境中 Amazon EC2 实例上的标准位置。Elastic Beanstalk 将生成以下日志。

Linux

  • /var/log/eb-activity.log

  • /var/log/eb-commandprocessor.log

  • /var/log/eb-version-deployment.log

Windows Server

  • C:\Program Files\Amazon\ElasticBeanstalk\logs\

  • C:\cfn\logs\cfn-init.log

这些日志中包含有关部署活动的消息,包括与配置文件(.ebextensions)有关的消息。

各应用程序和 Web 服务器都在其自己的文件夹中存储日志:

  • Apache/var/log/httpd/

  • IISC:\inetpub\wwwroot\

  • Node.js/var/log/nodejs/

  • nginx/var/log/nginx/

  • Passenger/var/app/support/logs/

  • Puma/var/log/puma/

  • Python/opt/python/log/

  • Tomcat/var/log/tomcat8/

日志在 Amazon S3 中的位置

当您从环境请求结尾日志或捆绑日志时,或在实例上传轮换日志时,它们存储在 Amazon S3 中您的 Elastic Beanstalk 存储桶中。对于您创建了环境的每个区域,Elastic Beanstalk 都会创建一个名为 elasticbeanstalk-region-account-id 的存储桶。在此存储桶内,日志存储在路径 resources/environments/logs/logtype/environment-id/instance-id 下。

例如,Elastic Beanstalk 环境 e-mpcwnwheky(位于账户 123456789012us-west-2 区域中)的实例 i-0a1fd158 的日志存储在以下位置:

  • 结尾日志

    s3://elasticbeanstalk-us-west-2-123456789012/resources/environments/logs/tail/e-mpcwnwheky/i-0a1fd158

  • 捆绑日志

    s3://elasticbeanstalk-us-west-2-123456789012/resources/environments/logs/bundle/e-mpcwnwheky/i-0a1fd158

  • 轮换日志

    s3://elasticbeanstalk-us-west-2-123456789012/resources/environments/logs/publish/e-mpcwnwheky/i-0a1fd158

注意

您可以在环境管理控制台中查找您的环境 ID。

Elastic Beanstalk 在结尾日志和捆绑日志创建 15 分钟后自动将它们从 Amazon S3 中删除。轮换日志会保留到您将它们删除或移入 Glacier。

Linux 上的日志轮换设置

在 Linux 平台上,Elastic Beanstalk 使用 logrotate 来定期轮换日志。如果已配置,则日志在本地轮换后,将由日志轮换任务选取并上传至 Amazon S3。默认情况下,已本地轮换的日志不会显示在结尾日志或捆绑日志中。

您可在 /etc/logrotate.elasticbeanstalk.hourly/ 中找到 logrotate 的 Elastic Beanstalk 配置文件。特定轮换设置是平台特定的,以后的平台版本中可能会有变化。如需有关可用的设置和示例配置的更多信息,请运行 man logrotate

配置文件在 /etc/cron.hourly/ 中由 cron 任务调用。有关 cron 的更多信息,请运行 man cron

扩展默认日志任务配置

Elastic Beanstalk 使用 EC2 实例上的子文件夹 /opt/elasticbeanstalk/tasks (Linux) 或 C:\Program Files\Amazon\ElasticBeanstalk\config (Windows Server) 中的文件配置结尾日志、捆绑日志和日志轮换任务。

在 Linux 上:

  • 结尾日志

    /opt/elasticbeanstalk/tasks/taillogs.d/

  • 捆绑日志

    /opt/elasticbeanstalk/tasks/bundlelogs.d/

  • 轮换日志

    /opt/elasticbeanstalk/tasks/publishlogs.d/

在 Windows Server 上:

  • 结尾日志

    c:\Program Files\Amazon\ElasticBeanstalk\config\taillogs.d\

  • 轮换日志

    c:\Program Files\Amazon\ElasticBeanstalk\config\publogs.d\

例如,Linux 上的 eb-activity.conf 文件将两个日志文件添加到结尾日志任务。

/opt/elasticbeanstalk/tasks/taillogs.d/eb-activity.conf

/var/log/eb-commandprocessor.log /var/log/eb-activity.log

您可以使用环境配置文件 (.ebextensions) 将自己的 .conf 文件添加到这些文件夹。.conf 文件列出应用程序特定的日志文件,Elastic Beanstalk 将这些日志文件添加到日志文件任务。

使用 files 部分可将配置文件添加到要修改的任务。例如,以下配置文本向您的环境中的每个实例添加一个日志配置文件。此日志配置文件 (即 cloud-init.conf) 向结尾日志添加 /var/log/cloud-init.log

files: "/opt/elasticbeanstalk/tasks/taillogs.d/cloud-init.conf" : mode: "000755" owner: root group: root content: | /var/log/cloud-init.log

将此文本添加到扩展名为 .config 的文件中,并将该文件添加到您的源包中名为 .ebextensions 的文件夹下。

~/workspace/my-app |-- .ebextensions | `-- tail-logs.config |-- index.php `-- styles.css

在 Linux 平台上,您也可以在日志任务配置中使用通配符。此配置文件将应用程序根目录下 .log 文件夹中扩展名为 log 的所有文件添加到捆绑日志中。

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

注意

在 Windows 平台上,日志任务配置不支持通配符。

有关使用配置文件的更多信息,请参阅使用配置文件 (.ebextensions) 进行高级环境自定义

与扩展结尾日志和捆绑日志非常相似,可以使用配置文件来扩展日志轮换。只要 Elastic Beanstalk 轮换自己的日志并将其上传到 Amazon S3,它也轮换和上传您的附加日志。日志轮换扩展的行为因平台的操作系统而异。以下部分介绍两种情况。

在 Linux 上扩展日志轮换

Linux 上的日志轮换设置中所述,在 Linux 平台上,Elastic Beanstalk 使用 logrotate 轮换日志。如果配置应用程序的日志文件进行日志轮换,应用程序无需创建日志文件的副本。Elastic Beanstalk 将 logrotate 配置为对每个轮换创建应用程序日志文件的副本。因此,应用程序在未主动向日志文件写入内容时,必须使这些日志文件保持解锁状态。

在 Windows Server 上扩展日志轮换

在 Windows Server 中,如果配置应用程序的日志文件进行日志轮换,该应用程序必须定期轮换这些日志文件。Elastic Beanstalk 查找其名称以配置的模式开头的文件,选取这些文件以便上传到 Amazon S3。此外,Elastic Beanstalk 忽略文件名中的句点,将句点之前的名称视为基本日志文件名。

Elastic Beanstalk 上传基本日志文件的所有版本 (最新版本除外),因为它认为最新版本是活动的应用程序日志文件,可能处于锁定状态。因此,应用程序可使活动日志文件在轮换之间保持锁定状态。

例如:应用程序写入名为 my_log.log 的日志文件,您在 .conf 文件中指定该名称。应用程序定期轮换该文件。在 Elastic Beanstalk 轮换周期中,它在日志文件的文件夹中找到以下文件:my_log.logmy_log.0800.logmy_log.0830.log。Elastic Beanstalk 将所有这些文件都视为基本名称 my_log 的版本。文件 my_log.log 的修改时间最晚,因此,Elastic Beanstalk 仅上传其他两个文件:my_log.0800.logmy_log.0830.log

Amazon CloudWatch Logs

您可以在 AWS 管理控制台中或借助配置选项将环境配置为将日志流式传输到 Amazon CloudWatch Logs。借助 CloudWatch Logs,您环境中的每个实例都会将日志流式传输到日志组。对于日志组,您可以将其配置为保留数周或数年 (即使在环境终止后)。

流式传输的日志集根据环境而有所不同,但始终包含 eb-activity.log 和来自在应用程序前运行的 nginx 或 Apache 代理服务器的访问日志。

您可以在创建环境期间为现有环境在 AWS 管理控制台中配置日志流。在以下示例中,日志最多保存七天,甚至在环境已终止时也是如此。


        CloudWatch 日志设置

下面的配置文件启用了保留期为 180 天(即使环境已终止)的日志流。

例 .ebextensions/log-streaming.config

option_settings: aws:elasticbeanstalk:cloudwatch:logs: StreamLogs: true DeleteOnTerminate: false RetentionInDays: 180