Hi users!
We released v1.20.0 on October 23, 2026. ChangeLog is here.
Fluentd v1.20.0 is the first release in the v1.20 series. It enables Ruby JIT by default and adds options to limit the size of evacuated buffer files and to discover new log files sooner, along with bug fixes and performance improvements.
Fluentd v1.20.0 requires Ruby 3.3 or later. Ruby JIT is now enabled by default, and it increases the memory usage of each worker process. Please see the "Notable changes" section below for details.
Fluentd now requires Ruby 3.3 or later.
Ruby 3.3 is needed to enable Ruby JIT through RubyVM::YJIT.enable.
The enable_jit option in the <system> directive now defaults to true.
Fluentd enables YJIT in each worker process, and it can improve the throughput.
On the other hand, JIT increases the memory usage of each worker process.
If you want to keep the previous behavior, set enable_jit false as follows:
<system>
enable_jit false
</system>
This option has no effect on Windows, because YJIT is not supported there.
In that case, Fluentd just logs Ruby JIT is not available on this Ruby at the info level.
Ref. enable_jit
yajl-rubyFluentd has used the json gem as the default JSON processor since v1.19.0.
This release also uses it to parse JSON streams, for example in parser_json with in_exec, and in in_forward and in_unix when they receive JSON.
Fluentd itself no longer uses yajl-ruby.
There is one behavior change.
When an input stream ends in the middle of a JSON document, Fluentd now logs a warning and discards the incomplete tail instead of raising ParseError.
Complete JSON documents received before the truncation are processed as before.
Fluentd now depends on json gem v2.21 or later.
Note for plugin developers: Fluentd still keeps yajl-ruby as a dependency for a while, because some third-party plugins require 'yajl' without declaring it in their gemspec. If your plugin uses yajl-ruby, please add it to the dependencies of your gemspec.
The new evacuate_limit_size option in the <buffer> section limits the total size of evacuated chunk files.
Fluentd v1.19.0 added a feature to evacuate buffer chunk files when the retry limit is reached. During a long outage, this can happen again and again, and the evacuated files can fill the disk. The new limit also counts the files evacuated before. Chunks that do not fit are discarded without being evacuated.
<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 (no limit). It keeps the previous v1.19.x behavior.0 to disable evacuation. It is the same as the behavior before v1.19.0.@id for the output plugin. Without @id, the evacuation directory can change when the configuration changes, and the files evacuated before are not counted.Ref. Handling Successive Failures
The new opt-in enable_dir_watcher option lets in_tail discover new files sooner.
in_tail usually finds new files by periodic checks every refresh_interval (60 seconds by default).
With this option, in_tail also watches the directories derived from path, and refreshes the file list when they change.
<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 (default: 100) sets the maximum number of directories watched at once. If there are more candidate directories, in_tail rotates the watched ones at each periodic refresh.inotify is used where available.path may also be found earlier. Use follow_inodes true to avoid duplicate collection after rename-based rotation.Ref. enable_dir_watcher
The new opt-in num_threads option lets in_tail parse lines on worker threads.
It can reduce delays in processing other files while a large or fast-growing file is parsed.
The default 1 keeps the previous behavior, which parses lines on the event loop.
Set it to 2 or more to enable worker parsing.
<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 and syslog parsers. In other cases, such as multiline parsing or open_on_every_update true, in_tail logs a warning at startup and keeps parsing on the event loop.in_monitor_agent reports worker_pending_batch_count, worker_pending_bytes and worker_parse_error_count.Ref. num_threads
in_forward can now receive events sent by Fluent Bit v5.0.5 or later with its default settings.
Fluent Bit v5.0.5 changed its out_forward plugin to send metadata within each event by default.
The timestamp of such an event is encapsulated with the metadata as [EventTime, metadata], as defined in Forward Protocol Specification v1.5.
Previous versions of in_forward could not handle this format.
With the default skip_invalid_event true, these events were dropped with a skip invalid event warning.
Now in_forward extracts the timestamp and ingests the record.
The metadata itself is not processed yet, and it is discarded.
umask optionYou can now set the umask of the Fluentd process with the umask option in the <system> directive.
Previously, this required the --umask command line option, which is inconvenient for services and container images.
<system>
umask 0022
</system>
When both are given, the command line option takes precedence.
send_keepalive_packet optionThe new send_keepalive_packet option enables TCP keepalive (SO_KEEPALIVE) on out_forward connections.
The existing keepalive option only reuses connections and does not send TCP keepalive packets, so dead connections could remain in CLOSE-WAIT state.
send_keepalive_packet is disabled by default, and it requires keepalive true.
Otherwise, Fluentd fails to start with a configuration error.
in_forward already has a similar option.
<match app.**>
@type forward
keepalive true
send_keepalive_packet true
<server>
host 192.168.1.3
</server>
</match>
command_timeout optionThe new command_timeout option limits how long an in_exec command can run.
When the command runs longer than this timeout, Fluentd logs child process timed out and kills the process.
The default is nil (no timeout).
Without a timeout, a hung command makes in_exec keep logging previous child process is still running. skipped., and it is hard to find the actual cause.
out_exec already has the same option.
<source>
@type exec
command /path/to/command
run_interval 10s
command_timeout 30s
tag example
<parse>
@type json
</parse>
</source>
parser_csv, parser_tsv and parser_ltsv are faster and allocate fewer objects.formatter_out_file is faster.json gem instead of yajl-ruby.in_tail reads files in 64KB blocks instead of 8KB, and EventTime.now is faster.parser_syslog: accept one space between the RFC3164 priority and the header. Some syslog senders emit records in this format.fluent-plugin-generate: add a .gitignore file to the generated plugin template.aarch64-mingw-ucrt) is now available.rotate_wait with follow_inodes true.<group> and then removed from the watch list, for example by limit_recently_modified.NameError when flushing buffered lines with emit_unmatched_lines true.multiline_flush_interval is no longer affected by system clock adjustments.Fixed a bug that could cause a file buffer chunk to be flushed twice, resulting in closed stream or ENOENT errors and incorrect buffer size metrics.
Also fixed the stage_size metric that could briefly become negative.
These fixes affect plugins using the http_server helper, such as in_monitor_agent and fluent-plugin-prometheus.
restart_worker_interval in the <system> directive.URI::InvalidURIError when binding to IPv6 addresses such as :: and ::1.Fixed graceful reload failing with YAML configuration files, for example when triggered through the RPC endpoint /api/config.gracefulReload.
Also fixed <<: !include of a file that contains a mapping.
It restores the documented shared parameter syntax.
out_file: fixed missing symlinks when symlink_path is used with chunk keys other than time. Previously, only one of the chunks with the latest timekey got a symlink.parser_msgpack: fixed leftover data from truncated input mixing into the next request, connection, datagram or record. It affected in_http, in_tcp, in_udp and filter_parser.emit_records and emit_size metrics always being 0 for input plugins with @label.out_file.Enjoy logging!
We have been posting information about Fluentd in Japanese on @fluentd_jp. We would appreciate it if you followed the X account.
Subscribed to the RSS feed here.
ClearCode, Inc. is a software company specializing in the development of Free Software. We maintain Fluentd and its plugin ecosystem, and provide commercial support for them.
Fluentd is an open source data collector to unify log management.
2026-08-14: Scheduled support lifecycle announcement about Fluent Package v7
2025-12-25: Drop schedule announcement about EOL of Fluent Package (fluent-package) 5
2025-09-04: Upgrade Guide for fluent-package v6
2024-08-29: Scheduled support lifecycle announcement about Fluent Package v6
2023-08-29: Drop schedule announcement about EOL of Treasure Agent (td-agent) 4
2023-08-29: Scheduled support lifecycle announcement about Fluent Package
2023-07-31: Upgrade to fluent-package v5
2026-10-23: Fluentd v1.20.0 has been released
2026-09-29: Fluentd v1.19.4 has been released
2026-09-29: fluent-package v6.0.5 has been released
2026-08-14: Scheduled support lifecycle announcement about Fluent Package v7
2026-06-26: fluent-package v6.0.4 has been released
2026-06-25: Fluentd v1.19.3 has been released
2026-03-27: fluent-package v6.0.3 has been released
2026-02-27: fluent-package v6.0.2 has been released
2026-02-13: Fluentd v1.19.2 has been released
2025-12-25: Drop schedule announcement about EOL of Fluent Package (fluent-package) 5
Want to learn the basics of Fluentd? Check out these pages.
Couldn't find enough information? Let's ask the community!
You need commercial-grade support from Fluentd committers and experts?
©2010-2026 Fluentd Project. ALL Rights Reserved.
Fluentd is a hosted project under the Cloud Native Computing Foundation (CNCF). All components are available under the Apache 2 License.
The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page, Privacy Policy and Terms of Use.