如何排查 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 集成问题。