Outputting JSON logs on Elastic Beanstalk with Amazon Linux 2
I found a solution that works well enough, so I'll post it here for posterity. If someone can suggest a better one, please do.
Elastic Beanstalk on Amazon Linux 2 relies on rsyslog
for log processing and output. There's a file at /opt/elasticbeanstalk/config/private/rsyslog.conf
that during deployment gets copied over to /etc/rsyslog.d/web.conf
and it's the one that's directing all output from the web
application to /var/log/web.stdout.log
.
The file doesn't include any custom template. It relies on rsyslog
's default template, which prefixes any %msg%
with a timestamp and $programname
(which is web
in this case).
I tried replacing this file via an .ebextensions
config, but that didn't work, because Elastic Beanstalk seems to be overwriting this file after .ebextensions
run. So I added an additional platform hook that deletes the file, keeping the custom one I added.
Here's the .ebextensions/logs.config
file:
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
and .platform/hooks/predeploy/remove-default-rsyslog-conf.sh
(make sure you chmod +x
this one):
#!/bin/sh
rm /etc/rsyslog.d/web.conf
systemctl restart rsyslog.service