アレについて記す

Elastic Beanstalkのアプリケーションから出る複数行ログ(stacktrace)をまとめる方法

Posted on October 23, 2018 at 23:45 (JST)

AWS Elastic Beanstalkの複数コンテナDockerプラットフォーム環境でawslogsドライバーを使用してCloudWatch Logsへログを流す時に、stacktraceを1行にまとめる方法について記載する。
なお、アプリケーションはJVM系でlogbackを使用している。

結論

Dockerrun.aws.json(EB用の設定ファイル)のオプションとlogback.xmlのフォーマットを指定することで、下のイメージのようにイベントをまとめられる。

ログイベントがまとまった図

[Dockerrun.aws.json(抜粋)]

awslogs-multiline-pattern でイベントを束ねるための条件を指定する。
今回はログの先頭に日時を出力しているため、日付フォーマットを指定。

[ !2019-01-13 追記 ]
日付フォーマット指定パターンではうまく動かないことがあることが判明した。
"awslogs-multiline-pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}"のように正規表現で指定した方が良い。

"logConfiguration": {
  "logDriver": "awslogs",
  "options": {
    "awslogs-region": "ap-northeast-1",
    "awslogs-group": "sample/backend",
    "awslogs-multiline-pattern": "%Y-%m-%d %H:%M:%S"
  }
}

[logback.xml(抜粋)]

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS,UTC} [%level] %logger{15} - %message%n%xEx%nopex%n</pattern>

logConfigurationに指定できるoptionについてはDeveloper Guideを参照。


ダメだったパターン

下記のようにスタックトレースの行区切り文字を \n から \r or \u2028 に変換する方法はうまくいかなかった。 Lambdaでのログ出力ならうまくいくのかもしれないが、未検証。

%replace(%ex){'\n','\r'}

\rに置き換えてみたときの参考
\u2028に置き換えてみたときの参考


以上。