CloudWatch Logsが見づらい!
EC2インスタンスで吐き出されるログをCloudWatchLogsに集約しているのですが、そのログがけっこう見づらくて困っておりました。
具体的には上記画像のように一つのエラーログが人まとまりにならず、複数行にわかれてしまうことです。
一つのエラーがひとまとまりになれば、何件エラーがあったとか、ログの境目が一瞬でわかるのに…と悩んでおりましたがしょうがないと思っておりました。
今回はLaravelで吐き出されるログをまとめたいと思います。
multi_line_start_patternでまとまりを作ることが可能
こちらにCloudWatchエージェントの設定ファイルの書き方があります
multi_line_start_pattern – ログメッセージの開始を識別するパターンを指定します。ログメッセージは、パターンに一致する 1 行と、後続パターンに一致しない行で構成されます。
このフィールドを指定しない場合、複数行モードが無効になり、空白文字以外の文字で始まる行は、前のログメッセージを終了して新しいログメッセージを開始します。
このフィールドを含める場合、{timestamp_format} を指定してタイムスタンプ形式と同じ正規表現を使用できます。それ以外の場合、CloudWatch Logs が複数行エントリの最初の行を判断するために使用する別の正規表現を指定できます。
とあるようにmulti_line_start_patternの設定でまとまりを作れることがわかりました。値としては正規表現とtimestamp_formatが使えるようなので
timestamp_formatで対応する
[2022-11-29 09:03:16]
Laravelはこのような形式のタイムスタンプで記録されているので、この形式に合わせます。
"timestamp_format": "[%Y-%m-%d %H:%M:%S]"
フォーマットの指定の仕方は最初に上げたリンクと同じですが、こちらに記載があります。
なので最終的にはこのようなjsonになります
{
"agent": {
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/path/to/laravel.log",
"log_group_name": "group_name_laravel.log",
"log_stream_name": "{instance_id}",
"retention_in_days": 30,
"timestamp_format": "[%Y-%m-%d %H:%M:%S]",
"multi_line_start_pattern": "{timestamp_format}"
}
]
}
}
}
}
これで取れるようになったのが以下のような形です(ぐちゃぐちゃですみません…)
参考までですがEC2へのCloudWatchエージェントの設定は以下の記事を参照ください