技術ログ

 【Fluentd入門ガイド】柔軟なデータ収集と効率的なログ管理のためのツール

2023年5月30日

Fluentdとは

Fluentdは、オープンソースのデータ収集エージェントです。大規模なデータ処理やログの収集・転送において優れたパフォーマンスを発揮し、柔軟なデータパイプラインの構築が可能です。Fluentdは、イベントログデータを収集し、異なるシステム間でデータの転送を行うことができます。また、プラグインベースのシステムであり、さまざまなデータソースや出力先に対応するプラグインが利用できます。これにより、様々なデータソースからのデータを統合的に収集し、処理することが可能となります。

基本概念と仕組み

Fluentdの基本概念と仕組みについて解説します。Fluentdは、データ収集、フィルタリング、転送の3つのフェーズでデータ処理を行います。データ収集では、さまざまなデータソースからデータを入力します。フィルタリングでは、データの加工や条件に基づくフィルタリングを行います。転送では、処理されたデータを指定された出力先に送信します。

Fluentdのコンポーネントとしては、エージェント、プラグイン、バッファ、マネージャなどがあります。エージェントはデータソースからのデータ収集とフィルタリングを担当し、プラグインは各種のデータソースや出力先に対応します。バッファはデータの一時的な蓄積を行い、マネージャは各コンポーネントの制御や監視を行います。

設定とインストール方法

Fluentdの設定とインストール方法について説明します。Fluentdのインストールは、各オペレーティングシステムに応じた手順に従って行います。インストールが完了したら、設定ファイルを編集します。設定ファイルでは、データソースのタイプや出力先、フィルタリングのルールなどを指定します。設定ファイルの記述方法や一般的な設定項目について詳しく解説します。

インストール方法

Fluentdのインストールには、パッケージマネージャーを使用する方法と、ソースコードからビルドする方法の2つがあります。ここでは、パッケージマネージャーを使用したインストール方法を説明します。

Ubuntu/Debian

$ curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent4.sh | sh

CentOS/RHEL

$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh

上記のコマンドにより、td-agent(Fluentdのパッケージ名)がインストールされます。

設定ファイルの作成

Fluentdの設定は、主に設定ファイル(td-agent.conf)を編集することで行います。設定ファイルは、ログの入力元(Input)、フィルタリングや変換(Filter)、出力先(Output)などのセクションで構成されます。

<source>
  @type tail
  path /var/log/nginx/access.log
  tag nginx.access
  format nginx
</source>

<filter nginx.access>
  @type record_transformer
  <record>
    message ${record["message"].upcase}
  </record>
</filter>

<match nginx.access>
  @type stdout
</match>

上記の例では、tailプラグインを使用してNginxのアクセスログを読み取り、record_transformerプラグインを使用してログメッセージを大文字に変換し、stdoutプラグインを使用して標準出力に出力しています。

設定ファイルの場所:

Fluentdの設定ファイルは、インストールによって異なる場所に配置されます。

Ubuntu/Debian

  • 設定ファイル: /etc/td-agent/td-agent.conf

CentOS/RHEL

  • 設定ファイル: /etc/td-agent/td-agent.conf

Fluentdの起動と停止:

Fluentdは、以下のコマンドを使用して起動と停止を行います。

起動

$ sudo service td-agent start

停止

$ sudo service td-agent stop

ログの収集と転送:

Fluentdは、設定ファイルで指定した入力プラグインによってログを収集し、フィルタリングや変換を行った後、指定した出力プラグインによってログを転送します。設定ファイルの詳細な記述方法や利用可能なプラグインについては、Fluentdの公式ドキュメントを参照してください。

以上が、Fluentdの設定とインストール方法の基本的な手順です。実際の環境や要件に応じて設定ファイルをカスタマイズし、適切なプラグインを使用してログの収集・加工・転送を行うことができます。

主なプラグインと活用例

Fluentdの主なプラグインとその活用例について紹介します。Fluentdは、多くのプラグインが提供されており、データソースや出力先に応じて適切なプラグインを選択することができます。

例えば、データソースとしては、ログファイル、データベース、メッセージキューなどのプラグインがあります。それぞれのプラグインを使って、異なるソースからのデータを収集する方法を解説します。

また、出力先としては、データベース、ストレージ、メッセージキュー、クラウドサービスなどのプラグインがあります。これらのプラグインを使用するFluentdの主なプラグインと活用例について解説します。

  1. ログファイルプラグイン: Fluentdは、ログファイルからのデータ収集に最適なプラグインを提供しています。これにより、アプリケーションやシステムのログをリアルタイムで収集し、集中的に管理することが可能です。たとえば、ApacheやNginxのアクセスログ、アプリケーションのログなどを収集することができます。
  2. データベースプラグイン: Fluentdは、さまざまなデータベースとの連携をサポートしています。MySQL、PostgreSQL、MongoDBなどのデータベースからデータを収集し、リアルタイムで処理や分析を行うことができます。また、データベースへのデータの書き込みもサポートしており、データの永続化や後処理に活用することができます。
  3. メッセージキュープラグイン: Fluentdは、メッセージキューシステム(例: Apache Kafka、RabbitMQ)との連携も可能です。メッセージキューを使用することで、アプリケーション間の非同期通信やタスクキューの実装が容易になります。Fluentdを介してメッセージキューにデータを送信することで、分散システムのデータフローを効果的に管理できます。
  4. クラウドサービスプラグイン: Fluentdは、主要なクラウドプロバイダとの連携をサポートしています。Amazon S3、Google Cloud Storage、Azure Blob Storageなどのクラウドストレージにデータを送信することができます。また、クラウドベースのログ管理サービス(例: Amazon CloudWatch、Google Cloud Logging)とも統合でき、ログデータの収集と分析をクラウド上で行うことができます。
  5. セキュリティプラグイン: Fluentdは、データのセキュリティを確保するためのプラグインも提供しています。TLS/SSLの活用やデータの暗号化、アクセス制御などのセキュリティ対策が可能です。これにより、データの保護とプライバシーの確保が強化されます。

インプットの設定方法

Fluentdのインプット(Input)の設定方法について詳しく説明します。Fluentdはさまざまなインプットプラグインを提供しており、それぞれのプラグインに特有の設定項目があります。以下では代表的なインプットプラグインとその設定方法について解説します。

in_tailプラグイン(ファイルからのログ読み取り)

in_tailプラグインは、ファイルからのログ読み取りに使用されます。以下はin_tailプラグインの設定例です。

<source>
  @type tail
  path /path/to/logfile.log
  tag mylogs
  read_from_head true
  <parse>
    @type json
  </parse>
</source>
  • @type: プラグインのタイプを指定します。in_tailプラグインの場合はtailを指定します。
  • path: 読み取るログファイルのパスを指定します。
  • tag: 読み取ったログに付けるタグを指定します。タグは後続の処理で使用されます。
  • read_from_head: ファイルの先頭から読み取るかどうかを指定します。
  • <parse>セクション: ログのパース方法を指定します。上記の例ではJSON形式のログをパースするためにjsonプラグインを使用しています。

in_forwardプラグイン(ネットワーク経由のログ送信)

in_forwardプラグインは、ネットワーク経由でログを受け取るためのプラグインです。以下はin_forwardプラグインの設定例です。

<source>
  @type forward
  port 24224
</source>
  • @type: プラグインのタイプを指定します。in_forwardプラグインの場合はforwardを指定します。
  • port: ログを受け付けるポート番号を指定します。

in_httpプラグイン(HTTP経由のログ送信)

in_httpプラグインは、HTTP経由でログを受け取るためのプラグインです。以下はin_httpプラグインの設定例です。

<source>
  @type http
  port 8888
  bind 0.0.0.0
  body_size_limit 32m
  keepalive_timeout 10s
</source>
  • @type: プラグインのタイプを指定します。in_httpプラグインの場合はhttpを指定します。
  • port: ログを受け付けるポート番号を指定します。
  • bind: バインドするアドレスを指定します。
  • body_size_limit: リクエストボディのサイズ制限を指定します。
  • keepalive_timeout: コネクションのタイムアウトを指定します。

上記の例は一部の代表的なインプットプラグインの設定例ですが、Fluentdにはさまざまなインプットプラグインがあります。使用するプラグインによって設定項目や挙動が異なるため、公式ドキュメントや各プラグインのドキュメントを参照して、具体的な設定方法を確認してください。

アウトプットの設定方法

Fluentdのアウトプット(Output)の設定方法について詳しく説明します。Fluentdはさまざまなアウトプットプラグインを提供しており、それぞれのプラグインに特有の設定項目があります。以下では代表的なアウトプットプラグインとその設定方法について解説します。

  1. out_fileプラグイン(ファイルへのログ書き込み)
    out_fileプラグインは、ログをファイルに書き込むためのプラグインです。以下はout_fileプラグインの設定例です。
<match mylogs>
  @type file
  path /path/to/output/file.log
  append true
</match>
  • <match>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。out_fileプラグインの場合はfileを指定します。
  • path: ログを書き込むファイルのパスを指定します。
  • append: ファイルにログを追記するか上書きするかを指定します。
  1. out_forwardプラグイン(ネットワーク経由のログ送信)
    out_forwardプラグインは、ネットワーク経由でログを送信するためのプラグインです。以下はout_forwardプラグインの設定例です。
<match mylogs>
  @type forward
  send_timeout 60s
  recover_wait 10s
  heartbeat_type tcp
  <server>
    host remote-host
    port 24224
  </server>
</match>
  • <match>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。out_forwardプラグインの場合はforwardを指定します。
  • send_timeout: 送信のタイムアウト時間を指定します。
  • recover_wait: 再接続までの待機時間を指定します。
  • heartbeat_type: ハートビートのタイプを指定します。TCPやUDPが選択できます。
  • <server>セクション: ログを送信するサーバーの設定を指定します。ホスト名とポート番号を指定します。
  1. out_elasticsearchプラグイン(Elasticsearchへのログ送信)
    out_elasticsearchプラグインは、Elasticsearchへログを送信するためのプラグインです。以下はout_elasticsearchプラグインの設定例です。
<match mylogs>
  @type elasticsearch
  host localhost
  port 9200
  index_name fluentd-${tag}
  include_tag_key true
</match>
  • <match>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。out_elasticsearchプラグインの場合はelasticsearchを指定します。
  • host: Elasticsearchのホストを指定します。
  • port: Elasticsearchのポート番号を指定します。
  • index_name: インデックス名を指定します。${tag}はタグを表し、ログのタグをインデックス名に含めることができます。
  • include_tag_key: インデックス名にタグを含めるかどうかを指定します。

上記の例は一部の代表的なアウトプットプラグインの設定例ですが、Fluentdにはさまざまなアウトプトプラグインがあります。使用するプラグインによって設定項目や挙動が異なるため、公式ドキュメントや各プラグインのドキュメントを参照して、具体的な設定方法を確認してください。

フィルターの設定方法

Fluentdのフィルター(Filter)の設定方法について説明します。フィルターは、受け取ったログデータに対して変換や加工を行うための機能です。Fluentdではさまざまなフィルタープラグインが提供されており、それぞれのプラグインに特有の設定項目があります。以下では代表的なフィルタープラグインとその設定方法について解説します。

filter_record_transformerプラグイン(レコードの変換)

filter_record_transformerプラグインは、受け取ったレコードを変換するためのプラグインです。以下はfilter_record_transformerプラグインの設定例です。

<filter mylogs>
  @type record_transformer
  <record>
    message ${record["message"].upcase}
    user_id ${record["user_id"]}
  </record>
</filter>
  • <filter>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。filter_record_transformerプラグインの場合はrecord_transformerを指定します。
  • <record>セクション: レコードの変換内容を指定します。上記の例ではmessageフィールドを大文字に変換し、user_idフィールドはそのまま保持しています。

filter_parserプラグイン(ログのパース)

filter_parserプラグインは、受け取ったログを解析してフィールドに分割するためのプラグインです。以下はfilter_parserプラグインの設定例です。

<filter mylogs>
  @type parser
  format apache2
  key_name log
</filter>
  • <filter>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。filter_parserプラグインの場合はparserを指定します。
  • format: ログのフォーマットを指定します。上記の例ではApache2のログフォーマットを指定しています。
  • key_name: パース結果を格納するフィールドのキー名を指定します。上記の例ではlogというフィールドにパース結果が格納されます。

filter_grepプラグイン(ログのフィルタリング)

filter_grepプラグインは、条件に一致するログのみをフィルタリングするためのプラグインです。以下はfilter_grepプラグインの設定例です。

<filter mylogs>
  @type grep
  <regexp>
    key message
    pattern ERROR
  </regexp>
</filter>
  • <filter>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。filter_grepプラグインの場合はgrepを指定します。
  • <regexp>セクション: フィルタリングの条件を指定します。上記の例ではmessageフィールドに含まれる文字列が"ERROR"と一致するログのみを通過させます。

上記の例は一部の代表的なフィルタープラグインの設定例ですが、Fluentdにはさまざまなフィルタープラグインがあります。使用するプラグインによって設定項目や挙動が異なるため、公式ドキュFluentdのフィルター(Filter)の設定方法について説明します。フィルターは、受け取ったログデータに対して変換や加工を行うための機能です。Fluentdではさまざまなフィルタープラグインが提供されており、それぞれのプラグインに特有の設定項目があります。以下では代表的なフィルタープラグインとその設定方法について解説します。

filter_record_transformerプラグイン(レコードの変換)

filter_record_transformerプラグインは、受け取ったレコードを変換するためのプラグインです。以下はfilter_record_transformerプラグインの設定例です。

<filter mylogs>
  @type record_transformer
  <record>
    message ${record["message"].upcase}
    user_id ${record["user_id"]}
  </record>
</filter>
  • <filter>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。filter_record_transformerプラグインの場合はrecord_transformerを指定します。
  • <record>セクション: レコードの変換内容を指定します。上記の例ではmessageフィールドを大文字に変換し、user_idフィールドはそのまま保持しています。

filter_parserプラグイン(ログのパース)

filter_parserプラグインは、受け取ったログを解析してフィールドに分割するためのプラグインです。以下はfilter_parserプラグインの設定例です。

<filter mylogs>
  @type parser
  format apache2
  key_name log
</filter>
  • <filter>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。filter_parserプラグインの場合はparserを指定します。
  • format: ログのフォーマットを指定します。上記の例ではApache2のログフォーマットを指定しています。
  • key_name: パース結果を格納するフィールドのキー名を指定します。上記の例ではlogというフィールドにパース結果が格納されます。

filter_grepプラグイン(ログのフィルタリング)

filter_grepプラグインは、条件に一致するログのみをフィルタリングするためのプラグインです。以下はfilter_grepプラグインの設定例です。

<filter mylogs>
  @type grep
  <regexp>
    key message
    pattern ERROR
  </regexp>
</filter>
  • <filter>タグ: 処理対象のタグパターンを指定します。上記の例ではmylogsタグを持つログが対象となります。
  • @type: プラグインのタイプを指定します。filter_grepプラグインの場合はgrepを指定します。
  • <regexp>セクション: フィルタリングの条件を指定します。上記の例ではmessageフィールドに含まれる文字列が"ERROR"と一致するログのみを通過させます。

上記の例は一部の代表的なフィルタープラグインの設定例ですが、Fluentdにはさまざまなフィルタープラグインがあります。使用するプラグインによって設定項目や挙動が異なるため、公式ドキュメントや各プラグインのドキュメントを参照して、具体的な設定方法を確認してください。

トラブルシューティング

Fluentdのトラブルシューティングには、以下のような一般的な問題とその対処方法があります。

  1. ログの欠落や遅延: Fluentdがデータを正しく処理できていない場合、ログの欠落や遅延が発生することがあります。これは、バッファ設定やネットワークの問題によるものです。対処方法としては、バッファサイズの調整やネットワークの帯域幅の確保、ログ収集の冗長化などが考えられます。
  2. プラグインの互換性の問題: Fluentdは多くのプラグインを利用できますが、プラグインのバージョンの互換性によって問題が発生することがあります。プラグインのバージョンを確認し、互換性のあるバージョンを使用するようにします。また、プラグインのドキュメントやコミュニティのサポートを活用することも重要です。
  3. リソース使用量の問題: Fluentdはデータのリアルタイム処理を行うため、リソース使用量が増加することがあります。メモリやCPUの使用量が過剰になる場合、システムのパフォーマンスに悪影響を与える可能性があります。リソースのモニタリングと適切なスケーリングを行い、リソース使用量を最適化する必要があります。
  4. ログの形式の問題: Fluentdはさまざまなログ形式に対応していますが、ログの形式が正しく解釈されない場合、データの正確性や可読性に問題が生じます。ログの形式を正しく定義し、パーサーの設定を適切に行うことで、ログデータの正確性を確保します。

ベストプラクティス

ベストプラクティスとしては、以下のポイントに留意することが重要です。

  1. ログの正確性と可読性の確保: ログデータは重要な情報源であり、正確性と可読性を確保することが重要です。ログの形式を適切に定義し、パーサーの設定を慎重に行います。また、ログのフィルタリングや加工によって必要な情報のみを抽出し、冗長なデータを排除することも重要です。
  2. バッファの設定と冗長化: バッファはデータの一時的な保持に使用されます。データの一時的な蓄積が必要な場合、バッファのサイズと設定を適切に行い、データの欠落や遅延を最小限に抑える必要があります。また、冗長化を考慮し、複数のバッファを使用することも推奨されます。
  3. モニタリングと監視: Fluentdの動作やパフォーマンスをモニタリングし、必要な場合にはアラートを設定することが重要です。ログの収集状況やリソース使用量、エラーログなどを定期に監視し、問題が発生した場合には迅速に対処することができます。
  4. ドキュメントとコミュニティの活用: Fluentdは広く利用されており、豊富なドキュメントやコミュニティが存在します。トラブルシューティングやベストプラクティスに関する情報を収集し、問題解決や改善策に活用することができます。公式ドキュメントやGitHubのリポジトリ、コミュニティフォーラムなどを積極的に参照しましょう。

これらのトラブルシューティングとベストプラクティスのポイントを把握し、Fluentdの運用を効果的に行うことが重要です。ただし、具体的な問題や環境によっては、より詳細な対処方法やカスタマイズが必要になる場合もあります。そのような場合には、Fluentdの公式ドキュメントやコミュニティのサポートを利用し、専門家の助けを借りることをおすすめします。

まとめ

Fluentdのプラグインエコシステムは非常に豊富であり、さまざまな用途に応じたプラグインが提供されています。これにより、データ収集から処理、保存、分析までのデータフローを柔軟に構築することができます。

  • この記事を書いた人
  • 最新記事

Maita Tomoya / yone

2020.4~Webアプリケーションエンジニアとして都内の企業で働き、空いている時間でブログを運営している29歳男です。本ブログは情報の整理をするため、文章を書く機会を作るために始めました。1記事でも多く「誰かのためになる記事」を書けるように頑張ります!転職前は地方の高校で働いていました。教育関係の記事も定期的に書いていきたいと思います。

-技術ログ