我有一个弹性beantalk环境,该环境正在运行具有节点js API的docker容器。在AWS控制台上,如果我选择我的环境,请转到配置/软件,我具有以下内容:
但是,如果我在Cloudwatch控制台上单击该日志组,则我有几周前的
由于这是一个dockerized应用程序,因此服务器本身的日志应位于 /aws/elasticbeanstalk/my-environment/var/log/eb-docker/containers/eb-current-app/stdouterr.log < / strong>。 如果我改为再次从EB环境直接从实例中获取日志,请单击“日志”,然后单击“请求最后100行”,则日志记录正确进行。使用CloudWatch时我什么都看不到。
很高兴得到任何帮助
答案 0 :(得分:4)
我能够解决这个问题。 因此,CloudWatch根据日志文件的第一行和日志流密钥进行哈希处理,问题是我在 stdouterr.log 文件上的第一行实际上是空行!
经过几天的工作并获得了良好的AWS支持团队的帮助,我首先通过SSH连接到与EB环境关联的EC2实例,您需要将以下行添加到 / etc / awslogs /config/beanstalklogs.conf 文件,紧接在“ file = / var / log / eb-docker / containers / eb-current-app / stdouterr.log ”行之后:>
file_fingerprint_lines = 1-20
使用这些,您告诉AWS服务它应该使用日志文件上的第1至20行来计算哈希。您可以将20更改为更大或更小的数字,具体取决于您的日志记录内容。但是我不知道该值是否有上限。
这样做之后,您需要在实例上重新启动 AWS Logs Service 。
为此,您将执行:
或更简单:
sudo服务awslogs重新启动
这些步骤之后,我开始使用我的环境,并且现在已将日志记录正确地流式传输到CloudWatch控制台! 但是,如果进行了新的部署,替换了EC2实例或自动可伸缩组产生了另一个实例,则将无法正常工作。
要对此进行修复,可以在部署之前通过 .ebextensions 目录在应用程序的根目录中添加日志配置。
我在新创建的 .ebextensions 目录中添加了一个名为 logs.config 的文件,并放置了以下内容:
files:
"/etc/awslogs/config/beanstalklogs.conf":
mode: "000644"
user: root
group: root
content: |
[/var/log/eb-docker/containers/eb-current-app/stdouterr.log]
log_group_name=/aws/elasticbeanstalk/EB-ENV-NAME/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-20
commands:
01_remove_eb_stream_config:
command: 'rm /etc/awslogs/config/beanstalklogs.conf.bak'
02_restart_log_agent:
command: 'service awslogs restart'
根据我在EB上的环境名称来更改 EB-ENV-NAME 。
希望它可以帮助别人!
答案 1 :(得分:2)
对于64位Amazon Linux 2,设置略有不同。
为交付日志,AWS CloudWatch Agent安装在/opt/aws/amazon-cloudwatch-agent
中,而Elastic Beanstalk配置安装在/opt/aws/amazon-cloudwatch-agent/etc/beanstalk.json
中。假设有一个名为stdouterr.log
的文件,它被设置为记录容器的输出,这是配置的一个片段:
{
"file_path": "/var/log/eb-docker/containers/eb-current-app/stdouterr.log",
"log_group_name": "/aws/elasticbeanstalk/EB-ENV-NAME/var/log/eb-docker/containers/eb-current-app/stdouterr.log",
"log_stream_name": "{instance_id}"
}
但是,当我查找file_path
时,它不存在,而是有一个文件路径对当前Docker容器ID /var/log/eb-docker/containers/eb-current-app/eb-e4e26c0bc464-stdouterr.log
进行编码。
此日志文件由/opt/elasticbeanstalk/config/private/eb-docker-log-start
服务启动的脚本eb-docker-log
创建,该文件的默认内容为:
EB_CONFIG_DOCKER_CURRENT_APP=`cat /opt/elasticbeanstalk/deployment/.aws_beanstalk.current-container-id | cut -c 1-12`
mkdir -p /var/log/eb-docker/containers/eb-current-app/
docker logs -f $EB_CONFIG_DOCKER_CURRENT_APP >> /var/log/eb-docker/containers/eb-current-app/eb-$EB_CONFIG_DOCKER_CURRENT_APP-stdouterr.log 2>&1
要临时修复日志记录,您可以手动运行(替换docker ID),然后日志将开始出现在CloudWatch中:
ln -sf /var/log/eb-docker/containers/eb-current-app/eb-e4e26c0bc464-stdouterr.log /var/log/eb-docker/containers/eb-current-app/stdouterr.log
要使其永久存在,我添加了一个.ebextension
来修复eb-docker-log
服务,以便它重新建立此链接,因此在源代码中以.ebextensions
创建一个名为{{1}的文件},并将其内容设置为:
fix-cloudwatch-logging.config