Fluentdを触ってみた(1)
※以下はfluentd v1.0(td-agent-4.1.1)をベースに書いてます。
Fluentdとは
ログの収集・転送・加工を行うツール。
syslogやファイルからログを収集し、ファイルやMongoDB、S3等に転送することができる。
Fluentdは、Inputプラグイン、Outputプラグイン、Bufferプラグインといったように
機能をプラグインの形で実装している。
各プラグインはFluentd製品が提供しているものや(Inputのtailとか)、
サードパーティ製のプラグインも存在する。
例えば、以下はsyslogからイベントを受信するInput設定。
- Input設定サンプル
<source> @type syslog port 5140 bind 0.0.0.0 tag test <parse> @type none </parse> </source>
- Output設定サンプル
<match test.**> @type file path /var/log/td-agent/output.txt </match>
こちらは、testタグがついたログを/var/log/td-agent/output.txtに出力する設定。
※fluentdではログにタグを付けることができ、付けたタグで出力先や転送先の挙動を変えることが可能。
イベントの受信
fluentdでイベントの受信を行うには、sourceディレクティブを使用する。
基本的な書き方は以下の通り。
<source> @type <プラグイン名> # 以下は各設定項目 port 5140 bind 0.0.0.0 tag test <parse> @type none </parse> </source>
@typeで指定するプラグインを指定する。
現在、公式で提供しているinputプラグインは以下の通り。
プラグイン名 | 説明 |
---|---|
in_tail | テキストファイルの末尾からイベントを読み取る(tail -f) |
in_forward | 別のfluentdから送られたデータを受信 |
in_udp | UDPプロトコルでイベントを受け取る |
in_tcp | TCPプロトコルでイベントを受け取る |
in_unix | UNIXドメインソケットからレコードを取得 |
in_http | HTTPリクエストを通してイベントを取得 |
in_syslog | syslogを通してイベントを取得 |
in_exec | 外部プログラムからイベントを取得(形式は標準出力、TSV、JSON等) |
in_sample | サンプルイベントを受信(デバッグ向け) |
in_windows_eventlog | Windowsイベントログからイベントを取得 |
以下の例では、syslogからイベントを取得するため、@typeにsyslogを指定している。
具体的な設定項目については、プラグインごとに異なるため、公式ドキュメントを参照。
<source> @type syslog port 5140 bind 0.0.0.0 tag test <parse> @type none </parse> </source>
また、fluentdの特徴として取得したイベントに“タグ”を付けることができる。
このタグは後述するmatchディレクティブの条件式として使用することができ、特定のタグのみをファイルに出力する、といったことが可能となる。(ログのルーティング)
上記の例ではタグとして「test」を指定している。
イベントの送信
fluentdでイベントの送信を行うには、matchディレクティブを使用する。
基本的な書き方は以下の通り。
<match 条件式> @type <プラグイン名> # 以下は各設定項目 path /var/log/td-agent/output.txt </match>
inputプラグインと同様、@typeで指定するプラグインを指定する。
現在、公式で提供しているoutputプラグインは以下の通り。
プラグイン名 | 説明 |
---|---|
out_copy | 複数ファイルへのコピー出力 |
out_null | イベントを破棄 |
out_roundrobin | 複数の出力にラウンドロビンでイベントを転送 |
out_stdout | 標準出力にイベントを転送 |
out_exec_filter | イベントを入力として、外部プログラムを実行し、実行結果を出力とする |
out_forward | 他のfluentdノードにイベントを転送 |
out_mongo / out_mongo_replset | MongoDBにレコード出力 |
out_exec | 外部プログラムにイベントを転送 |
out_file | ファイルにイベントを出力 |
out_s3 | AWS S3にファイル出力 |
out_webhdfs | HDFSにレコード出力 |
以下の例では、testタグの付いたログをファイルに出力するため、@typeにfileを指定している。
fileプラグインの設定項目であるpathに出力パスを指定することで、指定のパスにファイルとして出力させることが可能。
<match test.**> @type file path /var/log/td-agent/output.txt </match>
条件式内では“*”、“**”といったワイルドカードを使用することができる。
記号 | 説明 |
---|---|
* | 単一のタグにマッチ(a.*はa.bにマッチするが、a、a.b.cにはマッチしない) |
** | 0個以上のタグにマッチ(a.**はa.b、a.b.cにもマッチ) |
Q&A
Q. ファイルに出力したログのローテーションは可能?
A. できる。ただし、日時ローテのみ。
出力ログの形式は、fileプラグインのpathにて設定する。
デフォルトは“%Y%m%d”であるため、日付でログ名が変わる(=日付ローテーション)。
“%Y%m%d%H%M%S”まで指定可能であるため、必要に応じて変更する。
実際に、pathを“%Y%m%d%H%M”としてみる。
- 設定ファイル抜粋
<match test.**> @type file format single_value path output_%Y%m%d%H%M <buffer time> @type file path buffer timekey 1m timekey_wait 1m </buffer> </match>
出力間隔やバッファファイルの出力先はbufferディレクティブで設定する。
ここでは、timekey(出力間隔)を1分、ログが遅れて届いた場合のため、1分間のtimekey_wait(予備時間)を設定している。
拡張子はデフォルトで.logとなる。
- 実行結果
[root@fluentd1 ~]# ll total 123536 -rw-r--r--. 1 root root 165 Jul 3 12:22 output_202107031220_0.log -rw-r--r--. 1 root root 165 Jul 3 12:27 output_202107031225_0.log
このように、分刻みでのログ出力となる。
ファイル名末尾の_0について、fluentdは内部にバッファを持っており、バッファが一杯になった際に強制的にファイルに書き出す仕様となっている。
短時間でバッファが一杯になってしまった場合、同時刻に出力されたファイルと区別をつけるため、末尾に連番を付与している。
なお、appendをtrueにすると末尾の連番は付与されず、そのまま追記される。
オプションappendを有効にした場合の出力は以下。
-rw-r--r--. 1 root root 110 Jul 3 12:32 output_202107031230.log -rw-r--r--. 1 root root 213 Jul 3 12:34 output_202107031232.log
また、サイズローテーションについてはfluentdの機能では不可能。
Linuxであれば、logrotateを使用すること。
(参考) github.com