我已经有一个Elastic Beanstalk实例将我的日志流式传输到Cloud Watch大约一年了。本周日志停止了流式传输。这可能是因为我在Beanstalk中"重建"了环境。同时没有进行任何配置更改。
我已经仔细检查了我的Beanstalk角色在IAM中是否具有正确的权限(它具有CloudWatchFullAccess(。
我还尝试删除所有现有的组日志。然后,我进入Beanstalk的"实例日志流到CloudWatch日志"区域,更改了日志保留期,并重新启动了应用服务器。果不其然,我的日志组被重新创建了(有了新的保留期(,所以我很确定权限看起来还可以。尽管如此,日志组中没有出现任何日志消息。
我已经通过Beanstalk请求了最近的日志,我可以看到消息正在写入应用服务器上的日志OK。
我的平台是Tomcat 8 with Java 8 running on 64bit Amazon Linux/2.6.2
我不知道从这里到哪里去。我没有错误消息要处理,也没有任何好主意要检查下一步要检查什么。
编辑:这是我在这里定义的CloudWatch的自定义配置
files:
"/etc/awslogs/config/company_log.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/tomcat8/company.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat8/company.log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat8/company.*
这可能是因为不允许。请确保EC2实例使用的角色可以访问:
logs:CreateLogGroup
logs:CreateLogStream
logs:GetLogEvents
logs:PutLogEvents
logs:DescribeLogGroups
logs:DescribeLogStreams
logs:PutRetentionPolicy
使用Elastic Beanstalk,EC2实例使用的IAM角色可能是aws-elasticbeanstalk-ec2-role
。使用JSON(如这里所建议的(为该角色提供对新策略的访问权限:ec2-cloudwatch-logs-stream
(如果有人知道更好的名称,请告诉我(:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:GetLogEvents",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:PutRetentionPolicy"
],
"Resource": [
"*"
]
}
]
}
并且它应该在用sudo services awslogs restart
重新启动awslogs
服务之后工作。如果没有;检查日志。你可以在这里找到:/var/log/awslogs.log
您可能已经升级了AWS AMI平台,因此Tomcat的位置不同(例如/var/log/Tomcat而不是/var/log/ttomcat8(。
我在一个新的Medium博客中详细介绍了这一切是如何工作的,以及一个.eextensions文件的例子和放在哪里。
以下是您可能可以使用的摘录,尽管本文解释了如何确定要流式传输的正确文件夹/文件。
packages:
yum:
awslogs: []
option_settings:
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: StreamLogs
value: true
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: DeleteOnTerminate
value: false
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: RetentionInDays
value: 90
files:
"/etc/awslogs/awscli.conf" :
mode: "000600"
owner: root
group: root
content: |
[plugins]
cwlogs = cwlogs
[default]
region = `{"Ref":"AWS::Region"}`
"/etc/awslogs/config/logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/tomcat/localhost.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/localhost.log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat/localhost.*
[/var/log/tomcat/catalina.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/catalina.log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat/catalina.*
[/var/log/tomcat/localhost_access_log.txt]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/access_log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat/access_log.*
commands:
"01":
command: systemctl enable awslogsd.service
"02":
command: systemctl restart awslogsd