var/log配下のtest.logをtailしてtagをtest.aとする。rewrite_tag_filterでtest.**が来たらtest.bへ書き換える。test.bをstdoutへ出力するみたいな設定を行いたいケース。
そのまま書くと以下のようになるかなと思って書いて実行するも上手くいかない。
<source> @type tail path /var/log/test.log tag test.a </source> <match test.**> @type rewrite_tag_filter <rule> tag test.b </rule> </match> <match test.b> @type stdout </match>
原因は分かっていてrewrite_tag_filter にマッチする条件に当てはまるため無限にrewrite_tag_filterが実行されてしまうため。
公式のQ & A
<match app.**> @type rewrite_tag_filter <rule> key level pattern /(.+)/ tag app.$1 </rule> </match> <match app.**> @type forward # ... </match>
fluentdは上から下に実行されるためrewriteが走った後に最初のmatchに当てはまり無限ループするという仕組み。matchにマッチしないようにすれば良いとのこと。
<match app.**> @type rewrite_tag_filter <rule> key level pattern /(.+)/ tag level.app.$1 </rule> </match> <match level.app.**> @type forward # ... </match>