使用 Amazon Linux 2 在 Elastic Beanstalk 上輸出 JSON 日誌
我們正在嘗試將我們的 Java 應用程序從目前的 Elastic Beanstalk JDK 8 平台遷移到在 Amazon Linux 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 格式輸出到標準輸出,以便我們以後可以使用 Logs Insights 查詢它們。但是有了前綴,Insights 不會“看到” JSON,而只會將整行視為文本 blob。
我在 AWS 上找不到任何文件。幾乎所有 Elastic Beanstalk 的文件都提到了 Amazon Linux 的第一個版本。
我找到了一個足夠好的解決方案,所以我會在這裡發布它以供後代使用。如果有人可以推荐一個更好的,請做。
Amazon Linux 2 上的 Elastic Beanstalk 依賴於
rsyslog
日誌處理和輸出。在部署期間有一個文件/opt/elasticbeanstalk/config/private/rsyslog.conf
被複製到/etc/rsyslog.d/web.conf
,它將應用程序的所有輸出定向web
到/var/log/web.stdout.log
.該文件不包含任何自定義模板。它依賴於
rsyslog
的預設模板,該模板在 any 前面%msg%
加上時間戳和$programname
(web
在這種情況下)。我嘗試通過
.ebextensions
config替換此文件,但這不起作用,因為 Elastic Beanstalk 似乎在.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