TL;DR / 結論から先に言うと
rewrite_tag_filter プラグインは、rewrite_tag_filterが出力するときのタグが、入力時に受け付けるタグのパターンと一致したら無限ループを起こし永遠にログが転送されません。
公式にその注意が記載されていますが、これにハマってる時にこのドキュメントにたどり着けるかというと微妙かと思い、このような記事にすることにしました。
この記事を作った目的
fluentdを使い慣れている人なら当たり前かもしれないんですが、最近fluentdを使い始めた自分が、ログが転送されない、出力されない場合があり、どハマりしたので記事として残しておくことにしました。
無限ループするパターンで、ログが転送されないのを確かめる
ログ転送のフローは以下の通り
- ファイルからJSONのログを読み込んでそのレコードに
example_tag.before
というタグをつける -
example_tag.(なんでもいい)
というタグがきたら、example_tag.after
というタグに変更する -
example_tag.after
というタグがきたら標準出力に出力する
# ファイルからJSONのログを読み込んでそのレコードに `example_tag.before` というタグをつける
<source>
@type tail
path /var/log/nanikano.log
pos_file /var/log/nanikano.log.pos
tag example_tag.before
<parse>
@type json
</parse>
</source>
# example_tag.(なんでもいい) というタグがきたら、 example_tag.after というタグに変更する
<match example_tag.**>
@type rewrite_tag_filter
<rule>
key nantoka
pattern /(.+)/
tag example_tag.$1
</rule>
</match>
# example_tag.after というタグがきたら標準出力に出力する
<match example_tag.after>
@type stdout
</match>
ログに書き込んでみる
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}
タグ付け替え後の example_tag.after
が、rewrite_tag_filter にマッチする条件の example_tag.**
にマッチするから無限ループしてしまうらしい。
無限ループしないパターンで、ログが転送されるのを確かめる
- ファイルからJSONのログを読み込んでそのレコードに
example_tag.before
というタグをつける -
example_tag.(なんでもいい)
というタグがきたら、example_tag_modddddddddddd.after
というタグに変更する -
example_tag_modddddddddddd.after
というタグがきたら標準出力に出力する
(変更箇所がわかりやすいようにタグが目立つようにしています)
# ファイルからJSONのログを読み込んでそのレコードに example_tag.before というタグをつける
<source>
@type tail
path /var/log/nanikano.log
pos_file /var/log/nanikano.log.pos
tag example_tag.before
<parse>
@type json
</parse>
</source>
# example_tag.(なんでもいい) というタグがきたら、 example_tag_modddddddddddd.after というタグに変更する
<match example_tag.**>
@type rewrite_tag_filter
<rule>
key nantoka
pattern /(.+)/
tag example_tag_modddddddddddd.$1
</rule>
</match>
# example_tag_modddddddddddd.after というタグがきたら標準出力に出力する
<match example_tag_modddddddddddd.after>
@type stdout
</match>
ログに書き込んでみる
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}
fluentdから標準出力に出力される。
タグ付け替え後の example_tag_modddddddddddd.after
が、rewrite_tag_filter にマッチする条件の example_tag.**
にマッチ しない
からフィルタを抜け出し、標準出力に出力される。
まとめ
rewrite_tag_filter
を使用するときは、入力時のタグと出力時のタグの形式に注意する。
入力時のタグと同じ形式の場合、無限ループを起こしてログが転送されない。
ログにもそれっぽい情報が出ないので、見当がついていないとハマる。
気がつくのに1週間くらいかかって、気づいた直後にドキュメントに記載されているのを見つけて心ポキっとした。同じ悲しみを生み出してはいけない。