如何将自定义日志添加到CloudWatch?发送默认日志,但如何添加自定义日志?
我已经添加了这样的文件:(在.ebextensions中)
files:
"/opt/elasticbeanstalk/tasks/bundlelogs.d/applogs.conf" :
mode: "000755"
owner: root
group: root
content: |
/var/app/current/logs/*
"/opt/elasticbeanstalk/tasks/taillogs.d/cloud-init.conf" :
mode: "000755"
owner: root
group: root
content: |
/var/app/current/logs/*
正如我所做的bundlelogs.d和taillogs.d这些自定义日志现在已经从控制台或网络中添加或检索,这很好但是它们不会持续存在且不会在CloudWatch上发送。
在CloudWatch中,我有默认日志,如
/aws/elasticbeanstalk/InstanceName/var/log/eb-activity.log
我想要另一个像这样的人
/aws/elasticbeanstalk/InstanceName/var/app/current/logs/mycustomlog.log
答案 0 :(得分:24)
bundlelogs.d 和 taillogs.d 都是从管理控制台检索的日志。您要做的是将默认日志(例如eb-activity.log)扩展到CloudWatch Logs。要扩展日志流,您需要在/etc/awslogs/config/
下添加其他配置。配置应遵循Agent Configuration file Format。
我已成功扩展我的自定义ubuntu / nginx / php平台的日志。这是我的extension file FYI。这是一个official sample FYI。
在你的情况下,它可能就像
files:
"/etc/awslogs/config/my_app_log.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/app/current/logs/xxx.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/logs/xxx.log"]]}`
log_stream_name = {instance_id}
file = /var/app/current/logs/xxx.log*
答案 1 :(得分:11)
到期的信用点Sebastian Hsu和Abhyudit Jain。
对于我们的特定用例,这是我为config
提出的最终.ebextensions
文件。解释某些方面的注释在代码块下面。
files:
"/etc/awslogs/config/beanstalklogs_custom.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/tomcat8/catalina.out]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Fn::Select" : [ "1", { "Fn::Split" : [ "-", { "Ref":"AWSEBEnvironmentName" } ] } ] }, "var/log/tomcat8/catalina.out"]]}`
log_stream_name = `{"Fn::Join":["--", [{ "Ref":"AWSEBEnvironmentName" }, "{instance_id}"]]}`
file = /var/log/tomcat8/catalina.out*
services:
sysvinit:
awslogs:
files:
- "/etc/awslogs/config/beanstalklogs_custom.conf"
commands:
rm_beanstalklogs_custom_bak:
command: "rm beanstalklogs_custom.conf.bak"
cwd: "/etc/awslogs/config"
ignoreErrors: true
我们的EB环境有一个标准的命名方案,正好是environmentName-environmentType
。我正在使用{ "Fn::Split" : [ "-", { "Ref":"AWSEBEnvironmentName" } ] }
将其拆分为两个字符串(名称和类型)的数组。
然后我使用{ "Fn::Select" : [ "1", <<SPLIT_OUTPUT>> ] }
来获取类型字符串。您的需求明显不同,因此您可能只需要以下内容:
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat8/catalina.out"]]}`
我正在使用Fn::Join
函数将EB环境名称与实例ID连接起来。请注意,实例ID模板是一个完全按给定方式回显的字符串。
部署自定义awslogs
文件时,conf
服务会自动重启。
当files
块覆盖现有文件时,它会创建一个备份文件,如beanstalklogs_custom.conf.bak
。此块会删除该备份文件,因为awslogs
服务会读取两个文件,从而可能导致冲突。
如果您登录EC2实例并sudo cat
该文件,您应该看到类似这样的内容。请注意,所有Fn
函数都已解决。如果发现Fn
函数未解析,请检查它是否存在语法错误。
[/var/log/tomcat8/catalina.out]
log_group_name = /aws/elasticbeanstalk/environmentType/var/log/tomcat8/catalina.out
log_stream_name = environmentName-environmentType--{instance_id}
file = /var/log/tomcat8/catalina.out*
答案 2 :(得分:5)
awslogs
代理在配置文件中查找它应该发送的日志文件。它有一些默认值。您需要对其进行编辑并指定文件。
您可以检查和编辑位于以下位置的配置文件:
/etc/awslogs/awslogs.conf
确保重启服务:
sudo service awslogs restart
您可以在那里指定自己的文件并创建不同的组,而不是。
请参阅以下链接,您将能够立即获取日志。
资源:
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html
编辑:
由于您不想编辑实例上的文件,因此可以将相关代码添加到代码根目录中的.ebextensions文件夹中。例如,这是我的01_cloudwatch.config
:
packages:
yum:
awslogs: []
container_commands:
01_get_awscli_conf_file:
command: "aws s3 cp s3://project/awscli.conf /etc/awslogs/awscli.conf"
02_get_awslogs_conf_file:
command: "aws s3 cp s3://project/awslogs.conf.${NODE_ENV} /etc/awslogs/awslogs.conf"
03_restart_awslogs:
command: "sudo service awslogs restart"
04_start_awslogs_at_system_boot:
command: "sudo chkconfig awslogs on"
在此配置中,我将从S3存储桶中取出相应的配置文件,具体取决于NODE_ENV。您可以在配置中执行任何操作。
答案 3 :(得分:0)
看一下AWS文档并不是很明显,但是您需要做一些事情。
(我们的环境是Ruby 2.6 Puma平台上的Amazon Linux AMI-Rails应用)。
首先,在IAM中创建一个策略,以使您的EB生成的EC2实例可以使用CloudWatch日志组并将其流式传输-我们将其命名为“ EB-Cloudwatch-LogStream-Access”。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:DescribeLogStreams",
"logs:CreateLogGroup",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk/*:log-stream:*"
}
]
}
创建此文件后,请确保将策略附加到(与IAM>角色中)与您的EB环境关联的 IAM实例配置文件和服务角色 (请检查环境的配置页面:“配置”>“安全性”>“ IAM实例配置文件” |“服务角色”)。
然后,在.config
目录中提供.ebextensions
文件,例如setup_stream_to_cloudwatch.config
或0x_setup_stream_to_cloudwatch.config
。在我们的项目中,通过为.config
设置较高的数字(例如0x
),使其成为部署期间运行的最后一个扩展名09_setup_stream_to_cloudwatch.config
文件。
然后,提供以下内容,用适当的文件名替换your_log_file
,请记住,一些日志文件位于Amazon Linux AMI上的/var/log
中,而另一些(例如由您的应用程序生成的文件)可能位于/var/app/current/log
之类的路径中:
files:
'/etc/awslogs/config/logs.conf':
mode: '000600'
owner: root
group: root
content: |
[/var/app/current/log/your_log_file.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/log/your_log_file.log"]]}`
log_stream_name = {instance_id}
file = /var/app/current/log/your_log_file.log*
commands:
"01":
command: chkconfig awslogs on
"02":
command: service awslogs restart # note that this works for Amazon Linux AMI only - other Linux instances likely use `systemd`
部署您的应用程序,您应该已经设置好!