FluentBitのfluent-bit.confについて

業務でFluentBitを扱っているため、今回設定ファイル(fluent-bit.conf)に関して記事に纏めました。


# FluentBitとは
FluentBitは、さまざまなデータソースからログを収集し、任意の出力先へ転送するためのオープンソースソフトウェアです。
Fluentdの軽量版として設計されており、リソースの少ない環境やエッジデバイスでも動作可能な点が特徴です。

https://fluentbit.io/

# FluentBitの主な構成要素
FluentBitは以下の3つの主要コンポーネントで構成されています。
<dl>
  <dt>Input（入力）</dt>
  <dd>さまざまなデータソース（ファイル、システムログなど）からログを収集します。</dd>
  <dt>Filter（フィルタ）</dt>
  <dd>収集したログを加工・変換します。（例：タグ付け、データの変換、特定のログの除外など）
  <dt>Output（出力）</dt>
  <dd>収集したログを指定の出力先へ転送します。</dd>
</dd>
</dl>


# FluentBitの基本設定
Fluent Bitは設定ファイル（fluent-bit.conf）を用いて動作を制御します。
例：Windowsログを収集する場合
【補足】
Windowsログは、イベントビューアーにて収集されています。
![windowsログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/8ad35fae-caa4-42f8-a605-dd396759ee15.png)


Windowsログの収集のプラグインは、winlogとwinevtlogの2種類あります。
※それぞれ出力されるデータは少し異なります。

### 【winlogの場合】
```fluent-bit.conf
[INPUT]
    Name         winlog
    Channels     System,Application,Setup,Security,ForwardedEvents
    Interval_Sec 1
    DB           winevtlog.sqlite
    Tag          winlog

[OUTPUT]
    Name  stdout
    Match *
```
#### ◆Input
|キー|説明|
|:--|:--|
|Name|プラグイン名|
|Channels|収集したいログチャンネル|
|Interval_Sec|各チャネル監視間隔|
|DB|ログの格納場所|
|Tag|タグ|

DBは指定しない場合、毎回最初からログが収集され、指定した場合は、前回実施してからのログが収集されます。
Tagは、FilterやOutputで対象のデータを特定する際に使用されます。(詳細は後述)

#### ◆Output
|キー|説明|
|:--|:--|
|Name|出力方法(stdoutはコンソールに標準出力します)|
|Match|対象タグを選択|

上記の設定だと全ての対象のデータをコンソールに標準出力しますが、MatchにInputで付与したTagを設定すると設定したTagのみに限定されます。

```fluent-bit.conf
[OUTPUT]
    Name  stdout
    Match winlog
```
上記の設定で出力されるログは以下の通りです。
```
{"RecordNumber"=>1917, 
"TimeGenerated"=>"2025-02-04 18:21:57 +0900", 
"TimeWritten"=>"2025-02-04 18:21:57 +0900", 
"EventID"=>16384, 
"Qualifiers"=>16384, 
"EventType"=>"Information", 
"EventCategory"=>0, 
"Channel"=>"Application", 
"SourceName"=>"Software Protection Platform Service", 
"ComputerName"=>"(PC名)", 
"Data"=>"", 
"Sid"=>"", 
"Message"=>"ソフトウェア保護サービスの 2125-01-11T09:21:57Z の再起動をスケジュールしました。理由: RulesEngine。", 
"StringInserts"=>["2125-01-11T09:21:57Z", "RulesEngine"]}
```
![windowsログ_winlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/5785b0b0-de3f-4512-8609-eeca9a5629ac.png)


### 【winevtlogの場合】
```fluent-bit.conf
[INPUT]
    Name         winevtlog
    Channels     System,Application,Setup,Security,ForwardedEvents
    Interval_Sec 1
    DB           winevtlog.sqlite
    Tag          winevtlog

[OUTPUT]
    Name  stdout
    Match *
```
先程のNameをwinevtlogに変更すればwinevtlogによるイベントログを収集出来ます。

上記の設定で出力されるログは以下の通りです。
```
 {"ProviderName"=>"Microsoft-Windows-Security-SPP", 
 "ProviderGuid"=>"{E23B33B0-C8C9-472C-A5F9-F2BDFEA0F156}", 
 "Qualifiers"=>16384, 
 "EventID"=>16384, 
 "Version"=>0, 
 "Level"=>4, 
 "Task"=>0,
 "Opcode"=>0,
 "Keywords"=>"0x80000000000000",
 "TimeCreated"=>"2025-02-28 12:52:40 +0900",
 "EventRecordID"=>4223,
 "ActivityID"=>"",
 "RelatedActivityID"=>"",
 "ProcessID"=>24484,
 "ThreadID"=>0,
 "Channel"=>"Application",
 "Computer"=>"(PC名)",
 "UserID"=>"",
 "Message"=>"ソフトウェア保護サービスの 2125-02-04T03:52:39Z の再起動をスケジュールしました。理由: RulesEngine。",
 "StringInserts"=>["2125-02-04T03:52:39Z", "RulesEngine"]}
```
![windowsログ_winevtlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/4e69651c-fd1f-4889-950a-9b31edbb6bc0.png)

比較してみるとwinevtlogの方が多くの情報が収集出来るようです。



ここで特定の項目だけ抽出したい、特定の条件に合致したログだけ抽出したいなどの場合に**Filter**を使用します。

### 例１：特定の項目だけ抽出、項目名変更、項目追加したい場合
Filterのmodifyプラグインを使用するとログを追加、削除等が出来ます。
[具体例]
Inputのプラグイン：winevtlog
特定の項目だけ抽出："TimeCreated","Message"
項目名変更：Message"⇒"message"に変更
項目追加："category"(値は"eventlog")

[INPUT]と[OUTPUT]の間に[FILTER]を追加します。
```fluent-bit.conf
[INPUT]
    Name         winevtlog
    Channels     System,Application,Setup,Security,ForwardedEvents
    Interval_Sec 1
    DB           winevtlog.sqlite
    Tag          winevtlog

[FILTER]
    Name         modify
    Match        winevtlog
    Remove       ProviderName
    Remove       ProviderGuid
    Remove       Qualifiers
    Remove       EventID
    Remove       Version
    Remove       Level
    Remove       Task
    Remove       Opcode
    Remove       Keywords
    Remove       EventRecordID
    Remove       ActivityID
    Remove       RelatedActivityID
    Remove       ProcessID
    Remove       ThreadID
    Remove       Channel
    Remove       Computer
    Remove       UserID
    Remove       StringInserts
    Rename       Message message
    Add category eventlog

[OUTPUT]
    Name  stdout
    Match *
```
上記の設定で出力されるログは以下の通りです。
```
{"TimeCreated"=>"2025-02-28 12:52:40 +0900", 
"message"=>"ソフトウェア保護サービスの 2125-02-04T03:52:39Z の再起動をスケジュールしました。理由: RulesEngine。", 
"category"=>"eventlog"}
```
#### ◆Filter
|キー|説明|
|:--|:--|
|Name|プラグイン名(modify)|
|Match|対象タグを選択|
|Remove|項目の削除|
|Rename|項目名の変更|
|Add|項目を追加|

Addは"Add 項目名 値"というように設定する必要があります。
その他にも色々設定出来るみたいなので、下記を参考してみて下さい。

https://docs.fluentbit.io/manual/pipeline/filters/modify

### 例2：特定の条件に一致したログだけを抽出したい場合
複雑な条件を指定したい場合はluaプラグインを使って条件を指定することが出来ます。
[具体例]
Inputのプラグイン：winevtlog

```fluent-bit.conf
[FILTER]
    Name lua
    Match winlog
    Script ./script/winevtlog_filter.lua
    Call filter_winevtlogs
```
※[INPUT]と[OUTPUT]は例1と同じ設定。

#### ◆Filter
|キー|説明|
|:--|:--|
|Name|プラグイン名(lua)|
|Match|対象タグを選択|
|Script|luaファイルパス|
|Call|実行する関数名|


```winevtlog_filter.lua
function filter_winevtlogs(tag, timestamp, record)
    local level = record["Level"]
    local providername = record["ProviderName"]
    local eventid = record["EventID"]

    if (level == 1)  
    or (providername == "Microsoft-Windows-IsolatedUserMode") 
    or (level == 3 and eventid == 700) then
        return 0, 0, record
    end

    return -1, 0, 0
end
```
#### ◆引数
|引数|キー|説明|
|:--|:--|:--|
|1|tag|受信ログのタグ|
|2|timestamp|受信ログのタイムスタンプ|
|3|record|受信ログ|

#### ◆戻り値
|引数|キー|説明|
|:--|:--|:--|
|1|code|-1：ログ削除、0：ログ変更しない、1：ログ更新|
|2|timestamp|0：タイムスタンプ変更しない、1：タイムスタンプ更新|
|3|record|受信ログ|

record["項目名"]で項目名の値を取得することが出来ます。
今回の各変数は以下に対応しています。
level：レベル(1：重大、2：エラー、3：警告、4：情報)
eventid：イベントID
providername：イベントソースだがXMLのProvider Nameのことを指す。

例：この場合だとソースはIsolatedUserModeだが、赤枠のMicrosoft-Windows-IsolatedUserModeを指定。
![windowsログ_providername.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/0d479d9d-06b3-4668-8e24-0198fedcb012.png)


以上を踏まえてこの設定の場合、
- レベルが重大
- Provider NameがMicrosoft-Windows-IsolatedUserMode
- レベルが警告でイベントIDが700

のログのみ抽出することが出来ます。

# まとめ
今回はFluentBitの基本的な設定に関して纏めました。少しでも参考になれば幸いです。
他にも色々な設定が出来るようなので、自分も色々触ってみて知見を増やしていきたいと思います。