業務でFluentBitを扱っているため、今回設定ファイル(fluent-bit.conf)に関して記事に纏めました。
FluentBitとは
FluentBitは、さまざまなデータソースからログを収集し、任意の出力先へ転送するためのオープンソースソフトウェアです。
Fluentdの軽量版として設計されており、リソースの少ない環境やエッジデバイスでも動作可能な点が特徴です。
FluentBitの主な構成要素
FluentBitは以下の3つの主要コンポーネントで構成されています。
- Input(入力)
- さまざまなデータソース(ファイル、システムログなど)からログを収集します。
- Filter(フィルタ)
- 収集したログを加工・変換します。(例:タグ付け、データの変換、特定のログの除外など)
- Output(出力)
- 収集したログを指定の出力先へ転送します。
FluentBitの基本設定
Fluent Bitは設定ファイル(fluent-bit.conf)を用いて動作を制御します。
例:Windowsログを収集する場合
【補足】
Windowsログは、イベントビューアーにて収集されています。
Windowsログの収集のプラグインは、winlogとwinevtlogの2種類あります。
※それぞれ出力されるデータは少し異なります。
【winlogの場合】
[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のみに限定されます。
[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"]}
【winevtlogの場合】
[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"]}
比較してみるとwinevtlogの方が多くの情報が収集出来るようです。
ここで特定の項目だけ抽出したい、特定の条件に合致したログだけ抽出したいなどの場合にFilterを使用します。
例1:特定の項目だけ抽出、項目名変更、項目追加したい場合
Filterのmodifyプラグインを使用するとログを追加、削除等が出来ます。
[具体例]
Inputのプラグイン:winevtlog
特定の項目だけ抽出:"TimeCreated","Message"
項目名変更:Message"⇒"message"に変更
項目追加:"category"(値は"eventlog")
[INPUT]と[OUTPUT]の間に[FILTER]を追加します。
[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 項目名 値"というように設定する必要があります。
その他にも色々設定出来るみたいなので、下記を参考してみて下さい。
例2:特定の条件に一致したログだけを抽出したい場合
複雑な条件を指定したい場合はluaプラグインを使って条件を指定することが出来ます。
[具体例]
Inputのプラグイン:winevtlog
[FILTER]
Name lua
Match winlog
Script ./script/winevtlog_filter.lua
Call filter_winevtlogs
※[INPUT]と[OUTPUT]は例1と同じ設定。
◆Filter
キー | 説明 |
---|---|
Name | プラグイン名(lua) |
Match | 対象タグを選択 |
Script | luaファイルパス |
Call | 実行する関数名 |
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を指定。
以上を踏まえてこの設定の場合、
- レベルが重大
- Provider NameがMicrosoft-Windows-IsolatedUserMode
- レベルが警告でイベントIDが700
のログのみ抽出することが出来ます。
まとめ
今回はFluentBitの基本的な設定に関して纏めました。少しでも参考になれば幸いです。
他にも色々な設定が出来るようなので、自分も色々触ってみて知見を増やしていきたいと思います。