web-dev-qa-db-ja.com

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にストリーミングされ、後でLogs Insightsを使用してクエリできるように、JSONでstdoutに出力しています。ただし、プレフィックスを付けると、InsightsはJSONを「認識」せず、行全体をテキストBLOBとして扱います。

AWSでそのためのドキュメントが見つかりません。 Elastic Beanstalkのドキュメントのほとんどすべてが、Amazon Linuxの最初のバージョンを参照しています。

4

私は十分に機能する解決策を見つけたので、後世のためにここに投稿します。誰かがより良いものを提案できる場合は、どうぞ。

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
3

Opとは少し異なる問題ですが、ここに私のソリューションを配置します-それは同じアイデアの周りにあり、うまくいけば、nodejsに関する他のコメント投稿者の質問のいくつかに答えます。

これはNode.js 12.xを実行しているAmazon Linux 2用です

問題:nodejs stdoutログが「web」の下でngi​​nxログと混合され、形式が正しくありません。

以前は、Nodejsを実行するAmazon Linux 1では、これらのログは/var/log/nodejs/nodejs.logおよび/var/log/nginx/access.log。それらを組み合わせて、IPアドレスをプレフィックスとして付けることは、それらを完全に混乱させるだけです。

私は転送されたソリューションに従い、少し修正しました。

  1. ログを2つの異なるファイルに分割するようにrsyslog.confを変更する.ebextension構成。ログファイルに表示されたパターンでフィルタリングしていますが、RainerScriptと互換性のある任意の正規表現を使用できます。

別のコメンターが指摘しているように、このファイルを編集してほしいかどうかはわかりません。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

  1. ログバンドルに含めるだけでなく、cloudwatchにストリーミングする必要がある、多かれ少なかれノードのstdoutである新しいログファイルができました。これらの構成は文書化されています(Amazon Linux 2では更新されていません)。ここでは設定は上書きされません。新しい設定を追加するだけです。
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
0
puttputt