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にストリーミングされ、後でLogs Insightsを使用してクエリできるように、JSONでstdoutに出力しています。ただし、プレフィックスを付けると、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
のデフォルトテンプレートに依存しています。これは、任意の%msg%
にタイムスタンプと$programname
(この場合はweb
)をプレフィックスとして付けます。
.ebextensions
config を使用してこのファイルを置き換えてみましたが、.ebextensions
の実行後にElastic Beanstalkがこのファイルを上書きしているように見えるため、うまくいきませんでした。そのため、追加したカスタムファイルを保持したまま、ファイルを削除する 追加のプラットフォームフック を追加しました。
これが.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
Opとは少し異なる問題ですが、ここに私のソリューションを配置します-それは同じアイデアの周りにあり、うまくいけば、nodejsに関する他のコメント投稿者の質問のいくつかに答えます。
これはNode.js 12.xを実行しているAmazon Linux 2用です
問題:nodejs stdoutログが「web」の下でnginxログと混合され、形式が正しくありません。
以前は、Nodejsを実行するAmazon Linux 1では、これらのログは/var/log/nodejs/nodejs.log
および/var/log/nginx/access.log
。それらを組み合わせて、IPアドレスをプレフィックスとして付けることは、それらを完全に混乱させるだけです。
私は転送されたソリューションに従い、少し修正しました。
別のコメンターが指摘しているように、このファイルを編集してほしいかどうかはわかりません。iはプライベートです。これに慣れていない場合は、標準出力ではなく、独自のログファイルに書き込むことをお勧めします。あなたはそのようにもっとコントロールできます。
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;WebTemplate
files:
"/opt/elasticbeanstalk/config/private/logtasks/bundle/node.conf" :
mode: "000755"
owner: root
group: root
content: |
/var/log/node/nodejs.log
files:
"/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 -s