yassy's note

なんかかきます

Fluentdを触ってみた(1)

※以下はfluentd v1.0(td-agent-4.1.1)をベースに書いてます。

Fluentdとは

f:id:yassy_225:20210703190559p:plain

ログの収集・転送・加工を行うツール。
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