我们正在尝试将Java应用程序从当前的Elastic 8平台迁移到在Amazon 2上运行Corretto 11的新平台。该应用程序运行良好,但日志处理方式发生了变化。web进程的输出现在存储在/var/log/web.stdout.log中,每一行都以时间戳和进程名作为前缀,即:
May 20 17:00:00 ip-10-48-41-129 web: {"timestamp":"2020-05-20T17:00:00.035Z","message":"...","logger":"...","thread":"MessageBroker-2","level":"INFO"}我们怎么才能去掉前缀?这些日志被流到CloudWatch中,我们将它们输出到JSON中的stdout,以便以后可以使用logs查询它们。但是使用前缀,Insight并不会“看到”JSON,而只是将整行视为文本blob。
我在AWS上找不到这方面的文件。几乎所有ElasticBean秸秆的文档都提到了Amazon的第一个版本。
发布于 2020-05-21 07:17:13
我找到了一个效果很好的解决方案,所以我会把它发到这里供后人参考。如果有人能提出更好的建议,请这样做。
Amazon 2上的弹性Bean秸秆依赖于rsyslog进行日志处理和输出。在/opt/elasticbeanstalk/config/private/rsyslog.conf中有一个文件在部署期间被复制到/etc/rsyslog.d/web.conf,它是将web应用程序的所有输出定向到/var/log/web.stdout.log的文件。
该文件不包括任何自定义模板。它依赖于rsyslog的S默认模板,该模板以时间戳和$programname (在本例中为web )作为任何%msg%的前缀。
我试图通过一个.ebextensions配置替换这个文件,但是这不起作用,因为ElasticBean秸秆似乎是在.ebextensions运行后覆盖这个文件。因此,我添加了一个删除文件的附加平台钩,保留了我添加的自定义文件。
下面是.ebextensions/logs.config文件:
files:
"/etc/rsyslog.d/web-files.conf":
mode: "000644"
owner: root
group: root
content: |
template(name="WebTemplate" type="string" string="%msg%\n")
if $programname == 'web' then {
*.=warning;*.=err;*.=crit;*.=alert;*.=emerg; /var/log/web.stderr.log;WebTemplate
*.=info;*.=notice /var/log/web.stdout.log;WebTemplate
}
commands:
remove-.bak-rsyslog:
command: rm -f *.bak
cwd: /etc/rsyslog.d和.platform/hooks/predeploy/remove-default-rsyslog-conf.sh (确保您chmod +x这个):
#!/bin/sh
rm /etc/rsyslog.d/web.conf
systemctl restart rsyslog.service发布于 2021-08-06 22:15:25
我使用平台钩来完成这个任务。唯一的问题是在应用程序部署和配置部署中都替换了/etc/rsyslog.d/web.conf,因此需要为两者都设置一个挂钩。
这种方法避免了在/opt/elasticbeanstalk/config/private中干扰ElasticBean秸秆的内部文件(自从以前的答案-- rsyslog.conf不再存在以来,这些文件已经改变了)。此外,平台挂钩现在是首选的now扩展。
如果使用CodeBuild,请不要忘记在输出工件中包含platformFiles目录(或放置文件的位置)。
注意:这段代码假定进程的名称是web。如果您在Procfile中定义了不同的进程名,请使用它。但是,我认为rsyslog配置应该始终位于/etc/rsyslog.d/web.conf,而不考虑进程名。
确保所有的.sh文件都是使用chmod +x执行的。
.platform/hooks/predeploy/10_logs.sh
#!/bin/sh
sudo platformFiles/setupLogs.sh.platform/confighooks/predeploy/10_logs.sh
#!/bin/sh
sudo platformFiles/setupLogs.shplatformFiles/setupLogs.sh
#!/bin/sh
# By default logs output to /var/log/web.stdout.log are prefixed. We want just the raw logs from the app.
# This updates the rsyslog config. Also grants read permissions to the log files.
set -eu
mv platformFiles/rsyslogWebConf.conf /etc/rsyslog.d/web.conf
touch /var/log/web.stdout.log
touch /var/log/web.stderr.log
chmod +r /var/log/web.stdout.log
chmod +r /var/log/web.stderr.log
systemctl restart rsyslog.serviceplatformFiles/rsyslogWebConf.conf
# This file is created from Elastic Beanstalk platform hooks.
template(name="WebTemplate" type="string" string="%msg%\n")
if $programname == 'web' then {
*.=warning;*.=err;*.=crit;*.=alert;*.=emerg; /var/log/web.stderr.log;WebTemplate
*.=info;*.=notice /var/log/web.stdout.log;WebTemplate
}看起来/opt/elasticbeanstalk/config/private/rsyslog.conf被/opt/elasticbeanstalk/config/private/rsyslog.conf.template取代了:
# This rsyslog file redirects Elastic Beanstalk platform logs.
# Logs are initially sent to syslog, but we also want to divide
# stdout and stderr into separate log files.
{{range .ProcessNames}}if $programname == '{{.}}' then {
*.=warning;*.=err;*.=crit;*.=alert;*.=emerg /var/log/{{.}}.stderr.log
*.=info;*.=notice /var/log/{{.}}.stdout.log
}
{{end}}在此基础上,我推测弹性豆柄使用此模板生成单个/etc/rsyslog.d/web.conf文件,其中包含每个定义的进程名的块。因为应用程序和配置部署都可以更改定义的进程,因此在两者之后重新创建该文件是有意义的。
发布于 2020-06-24 14:36:54
我将把我的解决方案放在这里,尽管这是一个与op不同的问题--它与op大致相同,并希望回答其他一些关于nodejs的评论问题。
这是针对运行Amazon 12.x的Amazon Linux 2的
<#>问题:nodejs标准日志与nginx日志混合在"web“下,格式很差。
以前,在运行Nodejs的Amazon 1中,这些日志被分离为/var/log/nodejs/nodejs.log和/var/log/nginx/access.log。将它们组合在一起并加上ip地址的前缀,只会使他们一塌糊涂。
我遵循了提出的解决方案,并对其进行了一些修改。
我不确定他们是否想让你编辑这个文件,就像另一位评论者指出的那样,因为is是私人的。如果您对此不满意,我建议您编写自己的日志文件,而不是stdout。那样你就有更多的控制权了。
files:
"/opt/elasticbeanstalk/config/private/rsyslog.conf" :
mode: "000755"
owner: root
group: root
content: |
template(name="WebTemplate" type="string" string="%msg%\n")
if $programname == 'web' and $msg startswith '#033[' then {
*.=warning;*.=err;*.=crit;*.=alert;*.=emerg; /var/log/web.stderr.log
*.=info;*.=notice /var/log/web.stderr.log;
} else if( $programname == 'web') then /var/log/node/nodejs.log;WebTemplatefiles:
"/opt/elasticbeanstalk/config/private/logtasks/bundle/node.conf" :
mode: "000755"
owner: root
group: root
content: |
/var/log/node/nodejs.logfiles:
"/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/node.json" :
mode: "000755"
owner: root
group: root
content: |
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/node/nodejs.log",
"log_group_name": "/aws/elasticbeanstalk/[environment_name]/var/log/node/nodejs.log",
"log_stream_name": "{instance_id}"
}
]
}
}
}
}
commands:
append_and_restart:
command: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a append-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/node.json -shttps://serverfault.com/questions/1017974
复制相似问题