Closed2

FluentbitをDocker上で手軽に試す方法

harrythecodeharrythecode

初めに

通常のFluentbitイメージはDistroless(OSが無い状態)で配布[1]されています。

一方で<version>-debugではShellが用意されているので自由にデバッグできます。今回検証に使ったのは「Fluentbit 2.0.8」(執筆時最新)です。

試し方

ここではtailプラグインを用いて説明します:

  • [terminal 1]

docker pull fluent/fluent-bit:latest-debug
docker run --name fluentbit --rm fluent/fluent-bit:latest-debug \
/fluent-bit/bin/fluent-bit -i tail \
  -p path=/tmp/test \
  -p refresh_interval=5 \
  -o stdout
  • [terminal 2]

docker exec -it fluentbit bash -c "echo $(date) >> /tmp/test"

すると「terminal1」では以下のような文字列が出力されたら動作確認は終了です。

[2023/01/19 15:39:35] [ info] [fluent bit] version=2.0.8, commit=9444fdc5ee, pid=1
[2023/01/19 15:39:35] [ info] [storage] ver=1.4.0, type=memory, sync=normal, checksum=off, max_chunks_up=128
...
[2023/01/19 15:41:00] [ info] [input:tail:tail.0] inotify_fs_add(): inode=3691433 watch_fd=1 name=/tmp/test
[0] tail.0: [1674142988.435493254, {"log"=>"Thu Jan 19 16:43:08 CET 2023"}]

Terminal 1のオプションの意味は次の通りです。

/fluent-bit/bin/fluent-bit -i tail -p path=/tmp/test -p refresh_interval=5 -o stdout

-i, --input=INPUT set an input

複数あるInputの方式で、https://docs.fluentbit.io/manual/pipeline/inputs/tail を利用する

-p, --prop="A=B" set plugin configuration property

  • path: 定期的にウォッチするログのパス
  • refresh_interval: ウォッチする秒間隔 (デフォルトは60秒)

-o, --output=OUTPUT set an output

複数あるOutputの方式で、https://docs.fluentbit.io/manual/pipeline/outputs/standard-output を利用する。

脚注
  1. https://github.com/fluent/fluent-bit-docker-image/issues/19 ↩︎

harrythecodeharrythecode

色々な設定を試す

Dockerコンテナには以下のような形式でログを出力するものがあります。

2022-12-20T08:50:59.715524095Z stdout F {"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}

これをParseする際には以下のように表現することが可能です。

(?<time>\S+) (?<stream>\S+) (?<flag>\S+) (?<log>.*)

💡豆知識

(?<任意の値>正規表現)は名前付きキャプチャと呼ばれ、一致した正規表現に名前をつけてグループ化することが可能です。これを使うことで、例えばElasticsearchではグループ化された項目が自動でタグ付けされ、特定のタグの値を検索する際に非常に便利です。[1]

今回はDetachモード(出入力なしでバックグラウンドで実行)でDockerコンテナを動かします。

  • [terminal1]

docker run --detach --name fluentbit --rm fluent/fluent-bit:latest-debug

Parserなしの状態

  1. Terminal 1上で入力を受け付ける
$ docker exec -it fluentbit bash
root@2004013caa9a:/# /fluent-bit/bin/fluent-bit -i tail -p path=/tmp/test -p refresh_interval=5 -o stdout
Fluent Bit v2.0.8
* Copyright (C) 2015-2022 The Fluent Bit Authors
  1. 新規Terminal上でファイルを作成。
$ docker exec -it fluentbit bash
$ vim /tmp/test
2022-12-20T08:50:59.715524095Z stdout F {"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}
  1. Terminal1上では以下のように表示される

[0] tail.0: [1674073729.915343507, {"log"=>"2022-12-20T08:50:59.715524095Z stdout F {"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}"}]

構造的にはJSONで出力されキー名 "log"に先ほどの値が入力されています。

Parserありの状態

先ほどのTerminal1のFluentbitプロセスをCtrl + C で終了させ、以下2つのファイルを作成します。

  • vim /tmp/parser.conf
[PARSER]
    Name my-parser
    Format regex
    Regex (?<time>\S+) (?<stream>\S+) (?<flag>\S+) (?<log>.*)
  • vim /tmp/app.conf
[SERVICE]
    Parsers_File /tmp/parser.conf

[INPUT]
    Name             tail
    Tag              dummy.data
    Path             /tmp/test
    Parser           my-parser
    Refresh_Interval 5

[OUTPUT]
    Name stdout
    Match *

先ほど作ったファイルを読み込んで動かし、別ターミナルで再度同じインプットを入力してファイルを上書きします。

/fluent-bit/bin/fluent-bit --config /tmp/app.conf

すると以下のようにParseされて表示されました。

[0] dummy.data: [1674074700.090086220, {"time"=>"2022-12-20T08:50:59.715524095Z", "type"=>"stdout", "flag"=>"F", "log"=>"{"message":"hello!","level":"info","timestamp":"2022-12-20T08:50:59.715524095Z"}"}]

脚注
  1. https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#named-matched-subexpressions ↩︎

このスクラップは2023/03/11にクローズされました