带有CloudWatch日志和Nginx的Elastic Beanstalk

时间:2017-06-04 09:17:55

标签: amazon-web-services nginx elastic-beanstalk amazon-cloudwatch

我已在我的EBS应用程序中激活了CloudWatch日志。我启用了截图附件:

enter image description here

但是当我查看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为原点)。

如何禁用/删除此错误?

感谢。

4 个答案:

答案 0 :(得分:1)

这是因为EC2实例上的awslogs应用程序正在寻找要发送到CloudWatch的文件。

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

/etc/awslogs/awslogs.conf

确保重启服务:

sudo service awslogs restart

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

资源:

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

答案 1 :(得分:1)

解决此问题的另一种方法是更改​​/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代理将停止寻找这些文件。

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

.ebextensions/myconfig.config放在您上载到Elastic beantalk的*.zip文件中。然后,弹性beantalk将执行myconfig.config中的命令。

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

答案 2 :(得分:0)

您可以使用以下.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,默认文件(用于Node):

[/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文件所做的。

答案 3 :(得分:0)

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

查看了/ 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

这终于对我有用。