CLOVER🍀

That was when it all began.

Fluent Bitで、複数のOutputを使いたい

これは、なにをしたくて書いたもの?

Fluentdでは、ひとつのレコードを複数の出力先で扱う場合、copy Output Pluginを使用します。

copy - Fluentd

これを、Fluent Bitでやる場合はどうするのかな?ということで、調べてみました。

結論は、とても単純でしたが。

Fluent Bitで複数のOutputを使う

Fluent Bitのドキュメントには、Fluentdでいうcopy Output Pluginに相当するものはありません。

どうするのかな?と思ったら、ストレートに解答したissueがありました。

Output plugin · Issue #721 · fluent/fluent-bit · GitHub

これを見ると、タグが複数のOutput Pluginにマッチするように設定を書けばよいみたいです。とてもシンプル。

というわけで、今回はこれを確認してみます。

環境

今回の環境は、こちらです。

$ uname -srvmpio
Linux 4.15.0-101-generic #102-Ubuntu SMP Mon May 11 10:07:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic

Fluent Bitのバージョンは、こちら。

$ /opt/td-agent-bit/bin/td-agent-bit --version
Fluent Bit v1.4.4

複数のOutputを使うように、Fluent Bitを設定する

では、Fluent Bitの設定を行います。結果がこちら。

$ grep -v '#' /etc/td-agent-bit/td-agent-bit.conf 
[SERVICE]
    Flush        5

    Daemon       Off

    Log_Level    info

    Parsers_File parsers.conf
    Plugins_File plugins.conf

    HTTP_Server  Off
    HTTP_Listen  0.0.0.0
    HTTP_Port    2020

[INPUT]
    Name   tcp
    Listen 0.0.0.0
    Port   5170
    Format json
    Tag    mytag.message

[OUTPUT]
    Name  stdout
    Match mytag.*

[OUTPUT]
    Name  file
    Match mytag.*
    Path  /tmp/file-output.txt

Inputにはtcpを使うことにします。

[INPUT]
    Name   tcp
    Listen 0.0.0.0
    Port   5170
    Format json
    Tag    mytag.message

ここでマッチしたタグが、Stdout Output PluginとFile Output Pluginの両方にマッチするように設定します。

[OUTPUT]
    Name  stdout
    Match mytag.*

[OUTPUT]
    Name  file
    Match mytag.*
    Path  /tmp/file-output.txt

設定後、Fluent Bitを再起動してから確認してみましょう。

メッセージを送ってみます。

$ echo '{"message": "Hello Fluent Bit!!"}' | nc localhost 5170

標準出力側で確認。

$ sudo journalctl -u td-agent-bit -f

...

May 24 15:27:41 ubuntu1804.localdomain td-agent-bit[1659]: [0] mytag.message: [1590334056.894144629, {"message"=>"Hello Fluent Bit!!"}]

ファイル側を確認。

$ cat /tmp/file-output.txt
mytag.message: [1590334056.894145, {"message":"Hello Fluent Bit!!"}]

両方のOutputに、同じレコードが渡っていますね。

というわけで、複数のOutputを使いたかったら、その分のOutputにマッチするようにタグを設定すればよい、と。