【入門】fluentd (td-agent) とは?インストールと使い方

fluentd (td-agent)fluentd (td-agent) とは、ログ収集ソフトウェアです。

アプリケーションや各 IoT 機器のログを1箇所に集約するために利用します。

スポンサーリンク

初めに

本記事は、以下のビッグデータ分析基盤シリーズの fluentd 編です。

スポンサーリンク

td-agent と fluentd の違い

td-agentfluentd の安定版です。

Fluentd は Ruby で作成されており、Ruby に起因するインストールやオペレーションの問題が発生する場合がありますが、td-agent では Ruby に起因する問題を回避します。

Fluentd is written in Ruby for flexibility, with performance-sensitive parts in C. However, some users may have difficulty installing and operating a Ruby daemon.

That is why Treasure Data, Inc provides the stable distribution of Fluentd, called td-agent. The differences between Fluentd and td-agent can be found here.

https://docs.fluentd.org/installation/install-by-rpm

Apache KafkaFluentd の違い

似たようなソフトウェアApache Kafka が存在します。

Apache Kafka の詳細について知りたい方は以下の記事をどうぞ

Apache Kafkafluentd の違い

Apache Kafkafluentd の違いは以下のとおりです。

一貫性冗長性キューイング機能
fluentdAt Least Onceなしなし
Apache KafkaExactly Onceあり
複数ノードでレプリカを持つ
あり

冗長性

消えては困るデータを利用する場合には、Kafka を利用します。

分析用途の場合は、一部のデータが欠落しても大きな問題とはなりにくいため、実装がかんたんな fluentd を利用します。

キューイング機能

以下の状況では、キューイング機能を持った Apache Kafka を利用します。

  • データの生成頻度に波がある
  • ストレージで高い書き込み性能を確保することが難しい場合
    (ビッグデータでよく利用される分散ストレージでは、高い書き込み性能を確保することは難しい)
スポンサーリンク

fluentd(td-agent)のインストール

以下の手順で td-agent をインストールします。

  1. fluentdtd-agent)をインストール
  2. インストールした td-agent を起動

fluentd (td-agent) をインストール

Amazon Linux2 の場合

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

RHEL / CentOS の場合

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

その他の OS の場合

以下の公式ドキュメントが詳しいので、そちらをご覧ください。

Installation - Fluentd

fluentd (td-agent)を起動

sudo systemctl start td-agent.service

fluentd(td-agent)の使い方

ログの送信

デフォルトの設定では、HTTP を利用して以下のようにログを送信することが可能です。

なお、URL のパスで td-agent のタグを指定可能です。

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

ログの確認

sudo tail -n 1 /var/log/td-agent/td-agent.log
2021-01-08 14:34:02.350601661 +0000 debug.test: {"json":"message"}

[時間・タグ・ログ] の順で格納されていることがわかります。

fluentd(td-agent)の設定

fluentdtd-agent)の設定ファイルのパスは以下です。

/etc/td-agent/td-agent.conf

fluentdtd-agent)の設定ファイルでは、以下のディレクティブで構成されます。

  • source ログの入力方法を決めるディレクティブ
  • match ログの出力方法を決めるディレクティブ
  • filter イベントプロセッシング(ログを加工する)ディレクティブ
  • system システムにまたがって設定をするディレクティブ
  • label match と filter の内部ルーティングを決めるディレクティブ
  • @include 他のファイルを include するディレクティブ

各ディレクティブの使い方は公式ドキュメントが最もわかりやすいです。

Config File Syntax - Fluentd

本記事では、よく利用する source, match, filter, include について日本語で記載します。

source: ログの入力方法

source ディレクティブでは、@type で Input Plugin 等を指定することでログの入力方法を設定します。

Input Plugin 一覧

source ディレクティブで利用可能な Input Plugin の一覧は以下のとおりです。

source ディレクティブの設定例

in_http プラグインを利用して HTTP エンドポイント + ポート 9888 でリッスンする場合の設定例を示します。

<source>
  @type http
  port 9888
</source>

動作検証

sudo systemctl restart td-agent.service
curl -X POST -d 'json={"port":"9888"}' http://localhost:9888/debug.test
sudo tail -n 1 /var/log/td-agent/td-agent.log
2021-03-06 04:52:10.295233061 +0000 debug.test: {"port":"9888"}

match: ログの出力方法

match ディレクティブでは、@type で Output Plugin 等を指定することでログの出力方法を設定します。

Output Plugin 一覧

match ディレクティブで利用可能な Output Plugin の一覧は以下のとおりです。

match ディレクティブの設定例

out_file プラグインを利用して myapp.access タグのメッセージを /var/log/td-agent/access にファイルとして出力する設定例を示します。

<match myapp.access>
  @type file
  path /var/log/td-agent/access
</match>

動作検証

sudo systemctl restart td-agent.service
curl -X POST -d 'json={"port":"9888"}' http://localhost:9888/myapp.access
cat /var/log/td-agent/access/*.log
2021-03-06T05:19:58+00:00	myapp.access	{"port":"9888"}

myapp.access タグを指定してメッセージを送信した場合、/var/log/td-agent/access ディレクトリにファイルが生成されることが確認できます。

filter: イベントプロセッシング(ログを加工)

filter ディレクティブでは、@type で Filter Plugin 等を指定することでログの加工方法を設定します。

Filter Plugins

Filter ディレクティブの設定例

record_transformer プラグインを利用して debug.* タグのメッセージを変更します。

<filter debug.**>
  @type record_transformer
  <record>
    add_tag "addTagTest!!!!"
  </record>
</filter>

動作検証

sudo systemctl restart td-agent.service
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
sudo tail -n 1 /var/log/td-agent/td-agent.log
2021-03-08 08:27:00.014104156 +0000 debug.test: {"json":"message","add_tag":"addTagTest!!!!"}

入力レコード {"json":"message"} に、record_transformer の record ディレクティブで指定した "add_tag":"addTagTest!!!!" が追加されていることが確認できます。

@include: 他の設定ファイルをインクルード

@include ディレクティブでは、他の設定ファイルをインクルード可能です。

@include ディレクティブの設定例

/etc/td-agent/config.d 配下に存在する *.conf ファイルをすべて include するような設定は以下のとおりです。

@include config.d/*.conf
sudo mkdir /etc/td-agent/config.d/
sudo vim /etc/td-agent/config.d/extra.conf
<match extra.**>
  @type stdout
</match>

動作検証

sudo systemctl restart td-agent.service
curl -X POST -d 'json={"extra":"test"}' http://localhost:8888/extra.test
sudo tail -n 1 /var/log/td-agent/td-agent.log
2021-03-08 09:11:14.797642791 +0000 extra.test: {"extra":"test"}

extra.test タグを持つレコードが /var/log/td-agent/td-agent.log に出力されているため、インクルードした extra.conf の設定が反映されていることが確認できます。

関連記事

ビッグデータ分析基盤入門シリーズの続きは以下です。


参考資料

公式ドキュメント

Introduction - Fluentd