クイックスタート:5分で始めるFluent Bitによるログ転送
小難しい理論は後回しにして、まずは実際に手を動かし、マシン上で軽快に動作するログコレクターを立ち上げてみましょう。
1. Ubuntu / DebianへのFluent Bitのインストール
ターミナルを開き、Fluent Bit公式のインストールスクリプトを実行してリポジトリを追加し、最新パッケージをインストールします:
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
sudo systemctl daemon-reload
sudo systemctl enable fluent-bit
RHEL、Rocky Linux、AlmaLinuxの場合は、以下のコマンドを実行します:
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
sudo systemctl enable --now fluent-bit
2. コンソールにメトリクスを出力する最小構成の作成
デフォルトの設定ファイルは /etc/fluent-bit/fluent-bit.conf に配置されています。パイプラインの動作を素早く検証するため、以下のサンプル設定を作成します:
sudo tee /etc/fluent-bit/fluent-bit.conf << 'EOF'
[SERVICE]
Flush 1
Log_Level info
Daemon off
[INPUT]
Name cpu
Tag my_cpu
Interval_Sec 2
[OUTPUT]
Name stdout
Match *
EOF
3. スタンドアロンでの動作テスト
バイナリを直接実行して、ターミナルに出力されるログデータを確認します:
/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf
CPUメトリクスを含むJSONデータが2秒ごとに出力されれば成功です。パイプラインは正常に開通しています。
Fluent Bitのアーキテクチャ:なぜこれほど軽量なのか?
「なぜ広く使われているLogstashやFluentdではないのか?」と疑問に思う方もいるでしょう。その決定的な違いはリソース消費量にあります。LogstashはJVM上で動作するため500MB〜1GBのRAMを消費し、Ruby製のFluentdも50〜100MB程度を必要とします。一方、純粋なC言語で書かれたFluent Bitは、毎秒数千行のログを処理しても消費メモリはわずか15〜30MB、CPU使用率も1%未満に収まります。1 vCPU・1GB RAMの格安VPSや、数千ノード規模のKubernetesクラスタにおいて、この差は致命的な優位性となります。
ログ処理パイプラインは、以下の5つのフェーズで構成されています:
- INPUT: ログファイル(
tail)、syslog、systemd journal、または各種メトリクスからデータを取得。 - PARSER: 生テキスト(Nginx、Apacheなど)をパースし、構造化されたJSONに変換。
- FILTER: フィールドの追加・削除、IPアドレスの抽出、不要行の除外、ホストメタデータの付与などを実行。
- BUFFER: 転送先の一時的なダウンに備え、ログをメモリまたはディスク(ファイルシステムバッファ)に一時退避。
- OUTPUT: Grafana Loki、Elasticsearch、OpenSearch、Kafkaなどの指定先へログを転送。
データの正確なルーティングは、TagとMatchのペアによって制御されます。INPUTブロックでTag web.nginx.accessを指定し、OUTPUTブロックでMatch web.nginx.*を定義することで、Fluent Bitがプレフィックスを自動照合して適切な宛先へ振り分けます。
実践構成:LokiとElasticsearchへの並行ルーティング
運用現場でよく採用されるのは、用途に応じたログの分岐です。リアルタイムなTail確認やGrafanaダッシュボードでの可視化にはLokiを用い、セキュリティ調査やデータ分析チームによる全文検索にはElasticsearchを活用します。
NginxアクセスログとシステムSyslogの収集
以下は、Linuxサーバーの本番運用に適した標準的な /etc/fluent-bit/fluent-bit.conf の設定例です:
[SERVICE]
Flush 1
Log_Level info
Parsers_File parsers.conf
Storage.path /var/log/fluent-bit/buffer
Storage.sync normal
Storage.checksum off
Storage.backlog.mem_limit 10M
# 1. INPUT: Nginxログの読み込み
[INPUT]
Name tail
Tag web.nginx.access
Path /var/log/nginx/access.log
Parser nginx
DB /var/log/fluent-bit/nginx.db
Mem_Buf_Limit 15MB
Storage.type filesystem
# 2. INPUT: Systemd Journal (Syslog) の読み込み
[INPUT]
Name systemd
Tag host.systemd
Read_From_Tail On
Storage.type filesystem
# 3. FILTER: ホストメタデータの付与
[FILTER]
Name record_modifier
Match *
Record env production
Record cluster vps-sg-01
# 4. OUTPUT 1: Grafana Lokiへの転送
[OUTPUT]
Name loki
Match web.nginx.*
Host loki-server.internal
Port 3100
Labels job=fluent-bit, app=nginx, env=$env
Auto_Kubernetes_Labels off
# 5. OUTPUT 2: Elasticsearchへの転送
[OUTPUT]
Name es
Match host.*
Host es-cluster.internal
Port 9200
Index linux-systemd-logs
Type _doc
HTTP_User elastic
HTTP_Passwd SecretPassword123
TLS On
TLS.verify Off
Retry_Limit 5
押さえておくべき3つの重要パラメータ:
DB /var/log/fluent-bit/nginx.db: 読み込み済みのログオフセットを軽量なSQLiteファイルに記録します。サービス再起動やOSリブート時にも前回の停止位置から再開できるため、ログの欠損や二重取り込みを防止できます。Storage.type filesystem: ディスクバッファを有効化します。万が一Elasticsearchとの接続が15分間途絶えても、ログはディスクへ安全に退避され、メモリ枯渇を防ぎます。Retry_Limit 5: ネットワークエラー時のリトライ上限回数を設定し、ワーカースレッドのスタックやハングアップを回避します。
本番運用で得られた最適化ノウハウ
モニタリング基盤の安定性は、適切なチューニングにかかっています。初期の運用では、Lokiバックエンドのわずか5分間のメンテナンスによりメモリバッファが溢れ、複数のサーバーでOOMアラートが多発するトラブルも経験しました。即座に適用すべき3つの実践的教訓を紹介します:
1. メモリ依存を脱却し、ディスクバッファを必須で有効化する
Fluent Bitはデフォルトでメモリ上にログをバッファリングします。転送先でネットワーク遅延が発生したりHTTP 429/503エラーが返されたりすると、メモリ消費量は瞬く間にMem_Buf_Limitの上限に達します。その結果、ログのドロップが発生するか、最悪の場合はOOM KillerによってWebサーバープロセスごと強制終了されかねません。重要なINPUTブロックでは、必ずStorage.type filesystemを設定してください。
2. ネットワーク転送前に不要なノイズログを除外する
すべてのログを無差別に送信してはいけません。AWS ALBからのヘルスチェックやKubernetesのliveness probeによる2秒ごとの/healthzリクエストは、ストレージ容量を急速に圧迫します。grepフィルタを使用して、送信元で即座に除外しましょう:
[FILTER]
Name grep
Match web.nginx.access
Exclude log ^.*"GET /healthz.*200.*$
このシンプルなルールを適用するだけでも、クラスタへ送信される無駄なログトラフィックを毎日40〜60%削減できます。
3. リロード前にドライランで構文チェックを実施する
設定ファイルを更新した直後にsystemctl restart fluent-bitを実行するのは危険です。まずは-d(ドライラン)フラグを使って構文エラーがないかを検証します:
/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf --dry-run
ターミナルにconfiguration syntax okと表示されたことを確認してから、安全にサービスをリロードしましょう:
sudo systemctl restart fluent-bit
sudo journalctl -u fluent-bit -f
パイプラインの構造とディスクバッファの仕組みを正しく理解すれば、極めて堅牢でリソース効率に優れたログシッパーを安定運用できます。

