带有 CloudWatch 日志和 Nginx 的 Elastic Beanstalk

Posted

技术标签:

【中文标题】带有 CloudWatch 日志和 Nginx 的 Elastic Beanstalk【英文标题】:Elastic Beanstalk with CloudWatch logs and Nginx 【发布时间】:2017-11-05 06:11:05 【问题描述】:

我已在我的 EBS 应用程序中激活 CloudWatch 日志。我已启用,如附加的屏幕截图:

但是当我查看 awslogs.log 时,我总是可以找到这个错误:

cwlogs.push.stream - WARNING - 3317 - Thread-1 - No file is found with given path '/var/log/httpd/error.log*'.
cwlogs.push.stream - WARNING - 3317 - Thread-1 - No file is found with given path '/var/log/httpd/access.log*'.

我不知道为什么,因为 httpd 是来自 Apache 的服务,而我正在使用 nginx(以 Node.js 作为源)。

如何禁用/删除此错误?

谢谢。

【问题讨论】:

我对 catalina.out 文件有同样的错误。它位于 awslogs.config 中指定的位置,但代理说:找不到具有给定路径的文件。但是当我手动打开文件(catalina.out)并在开头添加一些内容并保存时,代理开始看到它并流式传输日志。有什么想法吗? @hyeganeh 触摸 catalina.out 文件将解决该问题。我不知道这是否是弹性豆茎中的错误,但我建议在我的回答中使用 .ebextensions 解决方法。 【参考方案1】:

发生这种情况是因为您的 EC2 实例上的 awslogs 应用程序正在寻找这些文件以发送到 CloudWatch。

您可以检查和编辑位于以下位置的配置文件:

/etc/awslogs/awslogs.conf

确保重启服务:

sudo service awslogs restart

您可以在那里指定您自己的文件,并创建不同的组等等。

资源:

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html

【讨论】:

【参考方案2】:

您可以使用以下.ebextensions/awslog.config

container_commands:
  touch_logs:
    command: touch /var/log/nodejs/nodejs.log /var/log/nginx/access.log /var/log/nginx/error.log /var/log/httpd/access_log /var/log/httpd/error_log

这可确保您永远不会看到任何这些文件的“没有找到具有给定路径的文件”。

注意:如果您使用的是节点以外的容器,则可以将 /var/log/nodejs.log 替换为 beanstalklogs.conf 中的任何内容...


awslogs 配置文件为/etc/awslogs/config/beanstalklogs.conf,默认(用于节点):

[/var/log/nodejs/nodejs.log]
log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nodejs/nodejs.log
log_stream_name=instance_id
file=/var/log/nodejs/nodejs.log*

[/var/log/nginx/error.log]
log_group_name=/aws/elasticbeanstalk/YOUR_ENV/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/YOUR_ENV/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/YOUR_ENV/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/YOUR_ENV/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/YOUR_ENV/var/log/eb-activity.log
log_stream_name=instance_id
file=/var/log/eb-activity.log*

如您所见,这有 nginx 和 httpd 行。

可以: 1.删​​除这些httpd块。 2. 触摸这些文件。

触摸这些文件的侵入性似乎较小,并且会抑制错误消息,因此不会将任何内容发布到 cloudwatch 日志:

sudo touch /var/log/httpd/error_log /var/log/httpd/access_log

注意:当 EB 首次启动时,您会收到 httpd、nginx 和 nodejs.log 的错误!因此,在启动时触摸所有这些文件似乎更容易,这就是上面的 awslog.config 文件所做的。

【讨论】:

我用我们的 java elastic beanstalk 应用程序测试了这个答案,它可以工作(用 /var/log/tomcat8/debug.log 替换 /var/log/nodejs/nodejs.log)。 我在一个节点实例上测试了这个答案,它没有用,只是一直显示相同的错误【参考方案3】:

解决此问题的另一种方法是更改​​/etc/awslogs/config/beanstalklogs.conf 文件。

您可以创建一个包含以下内容的.ebextensions/myconfig.config 文件:

files:
  "/etc/awslogs/config/beanstalklogs.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      [/var/log/nodejs/nodejs.log]
      log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nodejs/nodejs.log
      log_stream_name=instance_id
      file=/var/log/nodejs/nodejs.log*

      [/var/log/nginx/error.log]
      log_group_name=/aws/elasticbeanstalk/YOUR_ENV/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/YOUR_ENV/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/YOUR_ENV/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/YOUR_ENV/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/YOUR_ENV/var/log/eb-activity.log
      log_stream_name=instance_id
      file=/var/log/eb-activity.log*
commands:
  01-remove-default-beanstalklogs:
    command: rm /etc/awslogs/config/beanstalklogs.conf.bak
  02-restart-awslogs:
    command: service awslogs restart

请注意,我已经注释掉了上传/var/log/httpd/error.log*/var/log/httpd/access.log* 文件的行。因此 CloudWatch 代理将停止查找这些文件。

Awslogs 在运行myconfig.config 中的命令之前使用@AndyHayden 提到的默认beanstalklogs.conf。这就是为什么我在 beanstalklogs.conf 文件更改后要求 awslogs 重新启动。

.ebextensions/myconfig.config 放在您上传到弹性beantalk 的*.zip 文件中。然后elastic beanstalk会执行myconfig.config中的命令。

这里是commands的使用文档:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-commands

【讨论】:

【参考方案4】:

我在我的一个环境中也遇到了这个问题,我在配置了实例的自动缩放的环境中遇到了这个问题,并且在发生过于频繁的缩放的环境中也遇到了这个问题。

查看 /var/logs 目录中的 awslogs 并出现此错误

cwlogs.push.stream - 警告 - 3317 - 线程 1 - 找不到给定路径 '/var/log/production.log*' 的文件。

我尝试使用命令创建文件

sudo touch /var/log/production.log

但这停止了错误,但即使在重新启动后也没有流式传输日志。

最后查看正确流式传输日志的其他实例,它是指向返回实际日志的文件的符号链接,因此通过容器命令从 ebextension 创建了一个符号链接

commands:
  "01":
    command: ln -sf /var/app/current/log/production.log /var/log/production.log

这终于对我有用了。

【讨论】:

以上是关于带有 CloudWatch 日志和 Nginx 的 Elastic Beanstalk的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cloudFormation 模板中包含 cloudWatch 日志组订阅?

带有 Amazon CloudWatch 的 Elastic Beanstalk Docker

Sumo Logic 和 Cloudwatch 日志不适用于查询源

AWS CloudWatch 中的指标、日志和事件之间有啥区别? [关闭]

无法将 Elastic Beanstalk 日志输出到 CloudWatch

CloudWatch 自定义 EC2 内存指标和带有 AutoScaling 策略的警报