弹性beantalk环境的Cloudwatch日志组上没有日志显示

时间:2019-08-13 16:26:11

标签: node.js docker logging amazon-elastic-beanstalk amazon-cloudwatch

我有一个弹性beantalk环境,该环境正在运行具有节点js API的docker容器。在AWS控制台上,如果我选择我的环境,请转到配置/软件,我具有以下内容:

  • 日志组: / aws / elasticbeanstalk / my-environment
  • 日志流:已启用
  • 保留: 3天
  • 生命周期:终止后保留

但是,如果我在Cloudwatch控制台上单击该日志组,则我有几周前的 Last Event Time (我相信这与创建环境的时间相对应),并且没有任何内容在日志上。

由于这是一个dockerized应用程序,因此服务器本身的日志应位于 /aws/elasticbeanstalk/my-environment/var/log/eb-docker/containers/eb-current-app/stdouterr.log < / strong>。 如果我改为再次从EB环境直接从实例中获取日志,请单击“日志”,然后单击“请求最后100行”,则日志记录正确进行。使用CloudWatch时我什么都看不到。

很高兴得到任何帮助

2 个答案:

答案 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停止
  • sudo服务awslogs启动

或更简单:

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