今更だけど、fluentdで一つのタグ(一部条件マッチする)に対して、条件分岐的に複数のアウトプットを行いたい時に少しはまったのでメモ。
要は、copyプラグインのstore句にタグ条件が書ける事を知ったという話です。
やりたい事
複数サーバから出てくる一つ一つのイベントに対して、一部マッチする複数のタグ条件で異なる処理を行いたい。
例えば、アクセスログを集めてきて、
①web.a.bというタグのものは、file出力とs3保管
②xweb.a.bというタグのものは、file出力のみ
こんな時、下記のようなフィルタを何も考えずに書くと、#1のファイル出力だけ処理され、#2のs3への処理は行われない。
個人的にはちょっと忘れがちだけど、fluentdは一つのイベントに対して、先にマッチするものがあると後のmatch句は効かない。。
#1
<match *.a.b>
type file
path /tmp/aaa
</match>
#2
<match web.a.b>
type s3
・・・
</match>
で、そんな時どうするか。
下記のように、copyを使ってstoreにマッチングするタグパターンを記述すれば実現出来る。 という嘘情報を書いたところ @tatsu-yam に勘違いを指摘いただいたので修正
<match web.a.b>
type copy
<store>
type file
</store>
<store>
type s3
</store>
</match>
<match *.a.b>
type file
</match>
store句の条件を指定出来ると知らずに、どうフィルタリングしようかとか結構迷ってしまった。
もっといい方法あるのかな。。
タグルーティングが冗長になりすぎてかなり長くなるのが悩ましい。。
久々に触ると色々忘れてるなと実感。。
改めて、fluentdはタグの設計が大事だなと思いました。