带有 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 中的指标、日志和事件之间有啥区别? [关闭]