Fluentdのラベル機能で処理の切替を行う

Fluentdに送信されたログを異なる2つの出力をしたい場合は
copyプラグインを使って実現するのが一般的かと思います。

その時に出力先に応じて独自のカラムを作成したり、
カラムの内容を変えたりしたい場合は単純にはいかなくなります。

そこでFluentdのラベル機能を利用すれば
Fluentdの標準機能のみできれいに設定することが可能です

実際には以下のような設定となります。

<source>
  @type forward
  @label @INPUT
  port 24224
  bind 0.0.0.0
</source>

<label @INPUT>
  <match>
    @type copy
    <store>
      @type relabel
      @label @OUT1
    </store>
    <store>
      @type relabel
      @label @OUT2
    </store>
  </match>
</label>

<label @OUT1>
  <match test.*>
    @type stdout
  </match>

</label>

<label @OUT2>
  <match test.*>
    @type stdout
  </match>
</label>

フィルタでレコードにカラムを追加する場合

@OUT1、@OUT2それぞれ共通のカラムを追加したい場合は@INPUTラベル内のフィルタで行い、
それぞれ別のカラムを追加したい場合hは@OUT1、@OUT2それぞれのラベル内にフィルタを書きます。

<source>
  @type forward
  @label @INPUT
  port 24224
  bind 0.0.0.0
</source>

<label @INPUT>
  <filter test.*>
    @type add
    uuid true
  </filter>
  <match>
    @type copy
    <store>
      @type relabel
      @label @OUT1
    </store>
    <store>
      @type relabel
      @label @OUT2
    </store>
  </match>
</label>

<label @OUT1>
  <match test.*>
    @type stdout
  </match>

</label>

<label @OUT2>
  <filter test.*>
    @type record_transformer
    enable_ruby true
    <record>
      receive_time ${Time.now.strftime('%Y-%m-%d %H:%M:%S')}
    </record>
  </filter>
  <match test.*>
    @type stdout
  </match>
</label>

動作確認

動作確認のために簡単なログを送信してみます。

echo '{"test":"hello"}' | /opt/td-agent/embedded/bin/fluent-cat test.out

標準出力された結果がこちら

2020-02-14 15:56:53.011846113 +0900 test.out: {"test":"hello","uuid":"8C2B3F55-62F8-4E3A-9C88-65484C85FFCC"}
2020-02-14 15:56:53.011846113 +0900 test.out: {"test":"hello","uuid":"8C2B3F55-62F8-4E3A-9C88-65484C85FFCC","receive_time":"2020-02-14 15:56:53"}

1つのログが2つになり、共通カラム、個別カラム追加もされていることが確認できました。

まとめ

このようにラベル機能を利用することで出力先に応じたレコードの変更などが柔軟にできるようになります。