地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Fluentd】rewrite_tag_filterで無限ループする設定

docs.fluentd.org

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>