应归功于Sebastian Hsu 和Abhyudit Jain。
这是我为.ebextensions 为我们的特定用例提出的最后一个config 文件。解释某些方面的注释在代码块下方。
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
log_group_name
我们的 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"]]}`
log_stream_name
我正在使用Fn::Join 函数将EB 环境名称与实例ID 连接起来。请注意,实例 ID 模板是一个字符串,它完全按照给定的方式回显。
服务
部署自定义conf 文件时,awslogs 服务会自动重启。
命令
当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*