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
 

Follow me!