AWS FireLens Fluent BitでAND条件のログ振り分け
先日、AWSのECS on Fargate環境を構築する機会があり、FireLens (Fluent Bit)を使用した、CloudWatch Logsへのログ書き出し設定を行いました。
その際に少しとまどったことをここにまとめます。
※ECS on Fargateの構築手順や、FireLensの設定手順は、ここには記載しません。
アプリケーションはRails製で、複数行のログを1レコードにまとめるよう、以下の記事を参考に、アプリケーションとFireLensで設定を行いました。
(Fluent Bitの設定についての説明がとても丁寧でわかりやすいですね。)
・Rails on ECSな構成でFluent Bitを利用して快適なロギングを実現する – Zenn
https://zenn.dev/machamp/articles/50ed6bc383539c
ここで、アプリケーション開発担当の方より、以下のようなログ振り分けのリクエストがありました。
- workerのログのうち、DEBUGログは別のロググループに書き出してほしい。
具体的なログ振り分けのルールとしては、以下となります。
- logfrom = worker かつ level = DEBUG のログは、ロググループ debug に書き出す。
- logfrom = worker かつ level != DEBUG のログは、ロググループ worker に書き出す。
Fluent Bitによるログ振り分けは、
FILTERプラグインで、振り分け条件ごとにタグをつける(付け替える)
→ OUTPUTプラグインで、タグに対するログ出力先を指定
で実現します。
ここで、今回のように「かつ(AND)条件」で振り分けたいときは、どうすればよいのか?
FILTERプラグインでは、Keyに対するValueの正規条件を指定するので、AND条件は指定できません。
Fluent Bitのドキュメントを見てもよくわからず、ネット上にはFluent Bitの記事がたくさんありますが、今回のようなAND条件の事例は見つけられませんでした。
いろいろ試したところ、
「FILTERプラグインで一度タグをつけ(付け替え)、そのタグに対して再度FILTERプラグインで条件を指定して、さらにタグを付け替える」
ことで解決できました。
具体的な設定としては、以下です。
# workerログは、タグを worker に付け替える [FILTER] Name rewrite_tag Match *-firelens-* Rule $log_from ^(worker)$ Worker false # workerログのDEBUGログは、タグを Debug に付け替える [FILTER] Name rewrite_tag Match Worker Rule $level ^(DEBUG)$ Debug false
logfrom = worker のログは、タグを Worker に付け替え、
Workerタグをつけたログのうち、level = DEBUG であれば、さらにタグを Debug に付け替えます。
これにより、AND条件で、別々のタグをつけることができました。
Fluent Bitでは、同じプラグインの設定が複数存在する場合、上から順に適用される(一度適用されると抜けて次のプラグイン処理に進むわけではない)ということですね。
OUTPUプラグインでは、以下のように、CloudWatch Logsへのログ書き出しを指定しました。
# タグ Worker のログを指定のロググループに書き出し [OUTPUT] Name cloudwatch_logs Match Worker region ap-northeast-1 log_group_name /ecs/app/worker log_stream_prefix worker- auto_create_group true # タグ Debug のログを指定のロググループに書き出し [OUTPUT] Name cloudwatch_logs Match Debug region ap-northeast-1 log_group_name /ecs/app/debug log_stream_prefix worker- auto_create_group true
もっとスマートな方法があるかもしれませんが、今回は上記の方法で実現しました。
(関連記事)
・AWS ECS on Fargate構築の課題と解決策、採用してよかったこと
https://inaba-serverdesign.jp/blog/20230607/aws-ecs-fargate.html