弹性 beanstalk 环境的 Cloudwatch 日志组上没有日志出现

Far*_*nal 6 logging node.js amazon-cloudwatch docker amazon-elastic-beanstalk

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

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

但是,如果我单击 Cloudwatch 控制台上的该日志组,我有几周前的最后事件时间(我认为这对应于创建环境的时间)并且日志中没有内容。

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

任何帮助很高兴

Far*_*nal 9

我能够解决这个问题。所以 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 日志服务

为此,您将执行:

  • 须藤服务 awslogs 停止
  • 须藤服务 awslogs 开始

或更简单:

须藤服务 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'
Run Code Online (Sandbox Code Playgroud)

当然,通过我在 EB 上的环境名称更改EB-ENV-NAME

希望它可以帮助别人!


Mat*_*ett 5

对于 64 位 Amazon Linux 2,设置略有不同。

为了传送日志,AWS CloudWatch 代理安装在/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}"
}
Run Code Online (Sandbox Code Playgroud)

但是,当我查找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
Run Code Online (Sandbox Code Playgroud)

要临时修复日志记录,您可以手动运行(替换 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
Run Code Online (Sandbox Code Playgroud)

为了使这个永久性,我添加了一个.ebextension来修复eb-docker-log服务,以便它重新制作此链接,因此在.ebextensions被调用的源代码中创建一个文件fix-cloudwatch-logging.config并将其内容设置为:

files:
  "/opt/elasticbeanstalk/config/private/eb-docker-log-start" :
    mode: "000755"
    owner: root
    group: root
    content: |
      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/
      ln -sf /var/log/eb-docker/containers/eb-current-app/eb-$EB_CONFIG_DOCKER_CURRENT_APP-stdouterr.log /var/log/eb-docker/containers/eb-current-app/stdouterr.log
      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
commands:
  fix_logging:
    command: systemctl restart eb-docker-log.service
    cwd: /home/ec2-user
    test: "[ ! -L /var/log/eb-docker/containers/eb-current-app/stdouterr.log ] && systemctl is-active --quiet eb-docker-log"
Run Code Online (Sandbox Code Playgroud)