如何排查 Elastic Beanstalk 的日志记录问题?

上次更新时间:2019 年 10 月 29 日

我的日志文件为空,或者我的日志流突然停止流式传输日志消息。我该如何在 AWS Elastic Beanstalk 解决此问题?

解决方法

根据您所遇到的日志记录问题,选择以下选项之一:

查找您的空日志文件

默认情况下,Elastic Beanstalk 会将所有日志保存到您环境中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上,并定期轮换您的日志,以管理文件大小和节省磁盘空间。Elastic Beanstalk 将日志导出到 Amazon Simple Storage Service (Amazon S3)。有关更多信息,请参阅 Linux 上的日志轮换设置

要访问最近轮换的日志消息,请查看 /var/log/rotated

了解为什么您的日志文件和日志流停止输出新的日志消息

使用 Amazon CloudWatch Logs 从您的 Elastic Beanstalk EC2 实例持续流式传输日志文件

如果在 EC2 实例上发生首次日志轮换之后,日志流停止运行,则您的应用程序可能不会记录唯一的行。例如,您的应用程序日志可能如下所示:

Hello my application!
- at time 1:00 PM
Hello my application!
- at time 2:00 PM
...

在上述示例中,并非每个行都是唯一的。唯一条目跨越两行。它需要至少两行才能唯一地标识此日志文件。

注意: CloudWatch Logs 代理将标识您的日志文件,并使用您文件中包含的唯一行数来检测何时发生日志轮换。

要使日志流再次工作,请尝试以下操作之一:

编辑应用程序日志格式,在每行开头包含一个唯一的标识符(如时间戳)。

-或者-

编辑 file_fingerprint_lines 条目,以对文件行数进行计数,直到所包含的行数足以唯一标识文件。

注意: 要编辑此设置,您必须自定义 CloudWatch Logs 代理配置。Elastic Beanstalk 与 CloudWatch Logs 的集成不直接支持流式传输您的应用程序生成的自定义日志文件。要流式传输自定义日志,请使用配置文件来直接安装 CloudWatch Logs 代理并配置要推送的文件。

例如,以下 .ebextension 自定义 Node.js 应用程序日志文件的 file_fingerprint_lines

files:
  "/etc/awslogs/config/beanstalklogs.conf":
    mode: "000644"
    user: root
    group: root
    content: |
      [/var/log/nodejs/nodejs.log]
      log_group_name=/aws/elasticbeanstalk/streamlogs/var/log/nodejs/nodejs.log
      log_stream_name={instance_id}
      file=/var/log/nodejs/nodejs.log*
      file_fingerprint_lines=2-5
 
      [/var/log/nginx/error.log]
      log_group_name=/aws/elasticbeanstalk/streamlogs/var/log/nginx/error.log
      log_stream_name={instance_id}
      file=/var/log/nginx/error.log*
 
      [/var/log/nginx/access.log]
      log_group_name=/aws/elasticbeanstalk/streamlogs/var/log/nginx/access.log
      log_stream_name={instance_id}
      file=/var/log/nginx/access.log*
 
      [/var/log/httpd/error.log]
      log_group_name=/aws/elasticbeanstalk/streamlogs/var/log/httpd/error.log
      log_stream_name={instance_id}
      file=/var/log/httpd/error.log*
 
      [/var/log/httpd/access.log]
      log_group_name=/aws/elasticbeanstalk/streamlogs/var/log/httpd/access.log
      log_stream_name={instance_id}
      file=/var/log/httpd/access.log*
 
      [/var/log/eb-activity.log]
      log_group_name=/aws/elasticbeanstalk/streamlogs/var/log/eb-activity.log
      log_stream_name={instance_id}
      file=/var/log/eb-activity.log*
 
commands:
  01_remove_eb_stream_config:
    command: 'rm -fr /etc/awslogs/config/beanstalklogs.conf.bak'
  02_restart_log_agent:
    command: 'service awslogs restart'

排查日志流创建失败问题

如果您启用了日志流,但您的日志流仍未显示,请参阅 排除 CloudWatch Logs 集成问题