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に置き換えてみたときの参考
以上。