Amazon-Web-Services

使用 Amazon Linux 2 在 Elastic Beanstalk 上輸出 JSON 日誌

  • December 3, 2021

我們正在嘗試將我們的 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%加上時間戳和$programnameweb在這種情況下)。

我嘗試通過.ebextensionsconfig替換此文件,但這不起作用,因為 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

引用自:https://serverfault.com/questions/1017974