FireLensのログルーティングで数値のログレベルを使う
FireLensを使ったログルーティングで数値で表現されるログレベルを使ってルーティングをやろうとしたときに躓いたのでメモ。 先に結論 パース前のログ(文字列)に対して正規表現を使うことで解決しました。 [FILTER] Name rewrite_tag Match *-firelens-* Rule $log .*level.*:(50|40)[,}].* $container_name.$container_id.error false [FILTER] Name rewrite_tag Match *-firelens-* Rule $log .*level.*:(30|20)[,}].* $container_name.$container_id.info false 困っていたポイント 一般的にログのレベルは文字列で表されることが多いですが(例えば INFO や ERROR など)、Fastify など一部のフレームワークではログレベルを数値で出力するのがデフォルトになっていたりします(Fastifyでは30がINFO、50がERRORなど)。1 FireLensは実質的にFluent BitなのでFastifyなどの構造化されたログをJSONでパースするなどの機能があり、パース後のログレベルをもとにrewrite_tagを使ったルーティングを書いていたのですが何故か動きませんでした。 動かなかったコンフィグ(一部抜粋) [FILTER] Name rewrite_tag Match *-firelens-* Rule $level ^(50|40)$ $container_name.$container_id.error false [FILTER] Name rewrite_tag Match *-firelens-* Rule $level ^(30|20)$ $container_name.$container_id.info false これでうまくいきそうですがタグが書き換わらず後段のルーティングが正しくできませんでした。 なぜ動かなかったのか 数値で表現されるログレベルをパースするとFluent Bitの内部的には数値としてデータを持ちますが、regexは文字列に対するマッチングを行うため、数値のフィールドに対しては正規表現を使うことができませんでした。 Regex not matching on integer values in records · Issue …Bug Report Describe the bug When using filters on the input generated by the plugin winevtlog regular expressions are … ...