LoginSignup
7
3

More than 5 years have passed since last update.

fluentdからログが転送・出力されてこない時に見てほしい記事 ( rewrite_tag_filter 使用上の注意 )

Last updated at Posted at 2019-04-05

TL;DR / 結論から先に言うと

rewrite_tag_filter プラグインは、rewrite_tag_filterが出力するときのタグが、入力時に受け付けるタグのパターンと一致したら無限ループを起こし永遠にログが転送されません。

公式にその注意が記載されていますが、これにハマってる時にこのドキュメントにたどり着けるかというと微妙かと思い、このような記事にすることにしました。

この記事を作った目的

fluentdを使い慣れている人なら当たり前かもしれないんですが、最近fluentdを使い始めた自分が、ログが転送されない、出力されない場合があり、どハマりしたので記事として残しておくことにしました。

無限ループするパターンで、ログが転送されないのを確かめる

ログ転送のフローは以下の通り
- ファイルからJSONのログを読み込んでそのレコードに example_tag.before というタグをつける
- example_tag.(なんでもいい) というタグがきたら、 example_tag.after というタグに変更する
- example_tag.after というタグがきたら標準出力に出力する

fluent.conf
# ファイルから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.log
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}

fluentdから標準出力に出力されない。
image.png

タグ付け替え後の example_tag.after が、rewrite_tag_filter にマッチする条件の example_tag.** にマッチするから無限ループしてしまうらしい。

無限ループしないパターンで、ログが転送されるのを確かめる

  • ファイルからJSONのログを読み込んでそのレコードに example_tag.before というタグをつける
  • example_tag.(なんでもいい) というタグがきたら、 example_tag_modddddddddddd.after というタグに変更する
  • example_tag_modddddddddddd.after というタグがきたら標準出力に出力する

(変更箇所がわかりやすいようにタグが目立つようにしています)

fluent.conf
# ファイルから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.log
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}
{"nantoka":"after"}

fluentdから標準出力に出力される。
タグ付け替え後の example_tag_modddddddddddd.after が、rewrite_tag_filter にマッチする条件の example_tag.** にマッチ しない からフィルタを抜け出し、標準出力に出力される。
image.png

まとめ

rewrite_tag_filter を使用するときは、入力時のタグと出力時のタグの形式に注意する。
入力時のタグと同じ形式の場合、無限ループを起こしてログが転送されない。
ログにもそれっぽい情報が出ないので、見当がついていないとハマる。
気がつくのに1週間くらいかかって、気づいた直後にドキュメントに記載されているのを見つけて心ポキっとした。同じ悲しみを生み出してはいけない。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3