ククログ

株式会社クリアコード > ククログ > 2026 > Fluentd v1.20.0をリリース

Fluentd v1.20.0をリリース

2026年10月23日にFluentdの最新版となるv1.20.0をリリースしました。

v1.20系の最初のリリースです。 Ruby JITをデフォルトで有効にしたほか、退避したバッファーファイルの容量制限や、ログファイルの検出・読み取りの改善などを実施しました。

本記事では、公式サイトで公開している情報を日本語で解説します。

更新時の注意点

Ruby 3.2のサポート終了

Fluentd v1.20.0では、Ruby 3.3以降が必要になりました。 Ruby JITを既定で有効にするのに使うRubyVM::YJIT.enableが、Ruby 3.3以降を要求するためです。

Ruby JITのデフォルト有効化

<system>セクションのenable_jitのデフォルト値をtrueに変更しました。 各ワーカープロセスでYJITを有効にすることで、スループットの向上が期待できます。

一方で、ワーカープロセスごとのメモリー使用量は増加します。 従来の動作を維持したい場合は、次のようにenable_jit falseを設定してください。

<system>
  enable_jit false
</system>

WindowsではYJITがサポートされていないため、この設定は効果がありません。 その場合は、Ruby JIT is not available on this Rubyというログをinfoレベルで出力します。

詳細はenable_jitのドキュメントを参照してください。

Fluentd本体でのyajl-rubyの使用終了

Fluentd v1.19.0から、JSON処理にはデフォルトでjson gemを使用しています。 今回のリリースではJSONストリームのパースにもjson gemを使用するようにしました。 対象には、in_execと組み合わせて使うparser_jsonや、JSONを受信するin_forward、in_unixなどが含まれます。 これにより、Fluentd本体ではyajl-rubyを使用しなくなりました。 必要なjson gemのバージョンはv2.21以降です。

この変更に伴い、入力ストリームがJSONドキュメントの途中で終了した場合の動作が変わります。 従来はParseErrorが発生していましたが、今後は警告を出力して末尾の不完全なデータを破棄します。 ストリームが途切れる前に受信した完全なJSONドキュメントは、従来どおり処理します。

なお、Fluentdの依存ライブラリには当面yajl-rubyを残します。 一部のサードパーティー製プラグインがgemspecで依存関係を宣言せずにrequire 'yajl'を使用しているためです。 プラグインでyajl-rubyを使用している開発者の方は、プラグインのgemspecに依存関係を追加してください。

主な新機能と改善

退避したバッファーファイルの合計サイズを制限

<buffer>セクションにevacuate_limit_sizeを追加しました。 退避したバッファーのチャンクファイルの合計サイズに上限を設定できます。

Fluentd v1.19.0ではリトライ上限に達したバッファーのチャンクファイルを自動的に退避する機能を追加しました。 しかし、障害が長時間続くと退避が繰り返され、退避したファイルによってディスクがいっぱいになる可能性がありました。 今回追加した設定では過去に退避したファイルも含めた合計サイズを制限できます。 退避すると合計サイズが上限を超えるチャンクは、退避せずに破棄します。

<match app.**>
  @type forward
  @id forward_app
  <server>
    host 192.168.1.3
  </server>
  <buffer>
    @type file
    path /var/log/fluent/buf
    evacuate_limit_size 1g
  </buffer>
</match>
  • デフォルト値はnil(制限なし)で、v1.19系と同じ動作です。
  • 0を指定すると退避を無効化でき、v1.19.0より前と同じ動作になります。
  • 上限は厳密ではありません。同じプラグインの複数のワーカーが同時に退避する場合などには、合計サイズが上限を超えることがあります。
  • 出力プラグインには@idの設定を推奨します。@idがないと、設定の変更によって退避先のディレクトリが変わることがあります。その場合、過去に退避したファイルは合計サイズに含まれません。

詳細は連続した送信失敗時の処理に関するドキュメントを参照してください。

in_tail: ディレクトリ監視による新しいファイルの早期検出

in_tailにenable_dir_watcherを追加しました。 明示的に有効にすることで、新しいログファイルをより早く検出できます。

通常、in_tailはrefresh_interval(デフォルトは60秒)ごとに新しいファイルを探します。 この設定を有効にすると、pathの指定に基づいてディレクトリも監視し、変更を検出したときにファイルの一覧を更新します。

<source>
  @type tail
  path /var/log/myapp/*.log
  pos_file /var/log/fluent/myapp.pos
  tag myapp
  enable_dir_watcher true
  follow_inodes true
  <parse>
    @type none
  </parse>
</source>
  • dir_watcher_limit(デフォルトは100)で、同時に監視するディレクトリ数の上限を設定できます。監視候補のディレクトリ数が上限を超える場合は、定期的な更新のたびに監視対象を入れ替えます。
  • ディレクトリ監視で検出できない場合に備えて、定期的な更新も引き続き実行します。
  • 検出までの時間はプラットフォームやファイルシステムによって異なります。Linuxでは利用できる場合にinotifyを使用します。
  • pathに一致するローテーション済みのファイルも、従来より早く検出される場合があります。リネームによるローテーション後の重複収集を防ぐため、follow_inodes trueを設定してください。

詳細はenable_dir_watcherのドキュメントを参照してください。

in_tail: ワーカースレッドでのパースに対応

in_tailにnum_threadsを追加しました。 行のパースをワーカースレッドで実行するための設定です。 大きなファイルや急速に追記されるファイルのパースによって、他のファイルの処理が遅れる問題を緩和できます。

デフォルト値の1では、従来どおりイベントループ上でパースします。 2以上を指定すると、ワーカースレッドでのパースを有効にできます。

<source>
  @type tail
  path /var/log/app/*.log
  pos_file /var/log/fluentd/app.log.pos
  tag app
  num_threads 2
  <parse>
    @type json
  </parse>
</source>
  • 全体のスループット向上を保証する機能ではありません。すべてのワーカースレッドが処理中の場合は、他のファイルの処理が待たされることがあります。
  • ファイル内のイベントの順序は維持されます。
  • 対応するパーサーはnone、regexp、json、csv、tsv、ltsv、msgpack、apache、apache2、apache_error、nginx、syslogです。
  • 複数行のパースやopen_on_every_update trueなど、対応していない設定では、起動時に警告を出力し、従来どおりイベントループ上でパースします。
  • ワーカースレッドでのパースが有効な間は、in_monitor_agentでworker_pending_batch_count、worker_pending_bytes、worker_parse_error_countを取得できます。

詳細はnum_threadsのドキュメントを参照してください。

in_forward: Fluent Bit v5.0.5以降との相互運用性の向上

Fluent Bit v5.0.5以降が送信するメタデータ付きイベントを受信し、そのタイムスタンプを使用できるようになりました。

Fluent Bitのout_forwardはv5.0.5からデフォルトで各イベントにメタデータを含めて送信するようになりました。 この形式では、Forward Protocol Specification v1.5に従って、タイムスタンプとメタデータが[EventTime, metadata]の形式で格納されます。 従来のin_forwardはこの形式を扱えず、デフォルトのskip_invalid_event trueでは、skip invalid eventという警告を出力してイベントを破棄していました。

なお、メタデータそのものの処理にはまだ対応していません。

システム設定にumaskを追加

<system>セクションのumaskで、Fluentdプロセスのumaskを設定できるようになりました。 従来はコマンドラインオプションの--umaskを指定する必要があり、サービスやコンテナーイメージでの設定に手間がかかっていました。

<system>
  umask 0022
</system>

設定ファイルとコマンドラインオプションの両方で指定した場合は、コマンドラインオプションを優先します。

out_forward: TCP keepaliveの送信に対応

out_forwardにsend_keepalive_packetを追加しました。 接続に対してTCP keepalive(SO_KEEPALIVE)を有効にできます。 既存のkeepaliveは接続を再利用するための設定で、TCP keepaliveパケットは送信していませんでした。 そのため、切断された接続がCLOSE-WAIT状態のまま残ることがありました。

send_keepalive_packetはデフォルトでは無効です。 有効にするには、keepalive trueも設定してください。 send_keepalive_packet trueだけを設定すると、設定エラーにより起動しません。 なお、in_forwardにはすでに同様の設定があります。

<match app.**>
  @type forward
  keepalive true
  send_keepalive_packet true
  <server>
    host 192.168.1.3
  </server>
</match>

in_exec: コマンドのタイムアウトを設定可能に

in_execにcommand_timeoutを追加しました。 コマンドの実行時間が指定した時間を超えると、child process timed outというログを出力してプロセスを強制終了します。 デフォルト値はnil(タイムアウトなし)です。

タイムアウトがない場合、コマンドが応答しなくなると、previous child process is still running. skipped.というログが出続けます。 このログだけでは、コマンドが応答していないことを把握しにくいという問題がありました。 なお、out_execにはすでに同じ設定があります。

<source>
  @type exec
  command /path/to/command
  run_interval 10s
  command_timeout 30s
  tag example
  <parse>
    @type json
  </parse>
</source>

パフォーマンス改善

  • parser_csv、parser_tsv、parser_ltsvの処理を高速化し、オブジェクトの生成数を削減しました。
  • 出力プラグインでメタデータやtimekeyの計算結果をキャッシュし、オブジェクトの生成数を削減しました。
  • formatter_out_fileの処理を高速化しました。
  • より多くのJSON処理で、yajl-rubyの代わりにjson gemを使用するようにしました。
  • Windowsではin_tailのファイル読み取り単位を8KBから64KBに変更し、EventTime.nowの処理も高速化しました。

その他の改善

  • parser_syslog: RFC3164の優先度とヘッダーの間に空白が1つ入る形式を受け付けるようにしました。一部のsyslog送信元がこの形式でレコードを送信します。
  • fluent-plugin-generate: 生成するプラグインのテンプレートに.gitignoreを追加しました。
  • Windows on Arm(aarch64-mingw-ucrt)向けのgemを提供するようにしました。

主な不具合修正

in_tailの安定性向上

  • follow_inodes trueを設定し、rotate_waitの期間中にローテーション済みのファイルへ追記した場合に、ログが重複する問題を修正しました。
  • <group>で読み取り量を制限しているファイルが、limit_recently_modifiedなどによって監視対象から外れた場合に、残りの行が収集されなくなる問題を修正しました。
  • emit_unmatched_lines trueを設定し、バッファーに保持している行を出力するときにNameErrorが発生する問題を修正しました。
  • 終了処理とファイルの検出やローテーションが重なった場合に、エラーやタイムアウトが発生する問題を修正しました。
  • multiline_flush_intervalがシステム時刻の調整の影響を受けないようにしました。

バッファーチャンクの二重フラッシュを修正

ファイルバッファーのチャンクが二重にフラッシュされる問題を修正しました。 この問題により、closed streamやENOENTのエラーが発生したり、バッファーサイズのメトリクスが不正確になったりすることがありました。 また、stage_sizeのメトリクスが一時的に負の値になる問題も修正しました。

http_serverヘルパーのバインド失敗時の動作とIPv6対応を修正

in_monitor_agentやfluent-plugin-prometheusなど、http_serverヘルパーを使用するプラグインに関する修正です。

ポートへのバインドに失敗した後、HTTPエンドポイントが復旧しない問題を修正しました。 従来はポートを待ち受けないままプラグインが起動していました。 今後はプラグインの起動を失敗として扱い、ポートが利用可能になるまでワーカーを再起動します。 再起動の間隔は<system>セクションのrestart_worker_intervalで調整できます。

また、::や::1などのIPv6アドレスにバインドすると、URI::InvalidURIErrorが発生する問題も修正しました。

YAML設定ファイルでのgraceful reloadを修正

YAML形式の設定ファイルを使用している場合に、RPCエンドポイントの/api/config.gracefulReloadなどから実行するgraceful reloadが失敗する問題を修正しました。 また、マッピングを含むファイルを<<: !includeで読み込めるように修正しました。 これにより、同じパラメーターを共有するための構文が、ドキュメントどおりに使えるようになりました。

その他の不具合修正

  • out_file: 時刻以外のチャンクキーとsymlink_pathを組み合わせた場合に、一部のシンボリックリンクが作成されない問題を修正しました。従来は、最新のtimekeyを持つチャンクのうち1つにしかシンボリックリンクが作成されていませんでした。
  • parser_msgpack: 途中で切れた入力の残りが、次のリクエスト、接続、データグラム、レコードに混入する問題を修正しました。in_http、in_tcp、in_udp、filter_parserに影響していました。
  • @labelを設定した入力プラグインで、emit_recordsとemit_sizeのメトリクスが常に0になる問題を修正しました。
  • out_fileなどで、Unixエポックを表す時刻のイベントを出力すると、時刻が空文字列になる場合がある問題を修正しました。

関連リンク

クリアコードはFluentdのサポートサービスやプラグイン開発を行っています。 td-agentやFluent Packageのアップデートについてもサポートしていますので、お問い合わせフォームよりお気軽にお問い合わせください。

日本コミュニティ向けのXアカウントでは、日々、Fluentdに関する情報を発信しています。 ぜひ @fluentd_jp をフォローしてください!