Fluentd is an open-source log collector that unifies data routing across infrastructure to replace proprietary SaaS ingestion pipelines.
Fluentd is an open-source log collector and data processor that unifies logging across distributed systems. It converts diverse log formats into structured JSON events, tags them for routing, and buffers data to memory or disk before sending it downstream. Decoupling log producers from storage allows engineering teams to reshape pipelines without altering application code.
Logz.io provides a managed cloud platform where ingestion, OpenSearch indexing, dashboards, and alerting operate out of the box. Fluentd replaces that proprietary pipeline with an open pipeline-as-code architecture. Instead of shipping raw data directly to third-party endpoints, DevOps engineers define collection, parsing, and filtering in version-controlled configuration files. This lets teams scrub credentials, mask sensitive fields at the cluster edge, and fan out a single stream to multiple backends—such as an internal search cluster for triage and cold object storage for long-term audits.
The trade-off lies in operational scope. Where Logz.io and hosted services like Papertrail deliver turnkey log viewers, live tailing, and managed maintenance, Fluentd handles only collection and routing. Adopting Fluentd means teams operate their own downstream storage—such as OpenSearch, Elasticsearch, ClickHouse, or Grafana Loki—alongside index retention policies. For teams running Kubernetes and prioritizing data control, Fluentd fits neatly into GitOps workflows, whereas organizations without dedicated platform capacity often find hosted SaaS easier to maintain.
Is Fluentd free for commercial use? Yes. Fluentd is free and open-source software under the Apache-2.0 license, with no paid tiers or feature paywalls.
Fluentd vs Logz.io — which should you choose? Choose Logz.io if you want a turnkey SaaS platform with managed storage and dashboards. Choose Fluentd if you want full pipeline custody and route records to self-hosted storage backends.
What is the difference between Fluentd and Fluent Bit? Fluent Bit is a lightweight forwarder written in C for resource-constrained edge nodes, whereas Fluentd is written in Ruby with a larger plugin ecosystem for central log aggregation and complex routing.
Fluentd is the right fit when an engineering team needs a proven aggregation layer to control log transformation and prevent vendor lock-in; it is not the tool for teams that lack capacity to run their own search clusters. Its Apache-2.0 license ensures complete freedom to deploy across private infrastructure without subscription fees, while continuous updates under the Cloud Native Computing Foundation provide dependable long-term maintenance.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Fluentd's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p fluentd && cd fluentd
curl -fsSL https://open-source.store/tools/fluentd/compose.yml -o compose.ymltouch .envdocker compose up -dservices:
fluentd:
image: fluent/fluentd:v1.20.1-debian-1.0
restart: always
ports:
- "127.0.0.1:9880:9880"
- "127.0.0.1:24224:24224"
- "127.0.0.1:24224:24224/udp"
volumes:
- fluentd-log:/fluentd/log
configs:
- source: fluentd_conf
target: /fluentd/etc/fluent.conf
healthcheck:
test: ["CMD", "ruby", "-e", "require 'net/http'; begin; res = Net::HTTP.get_response(URI('http://127.0.0.1:9880/fluentd.healthcheck')); exit(res.is_a?(Net::HTTPSuccess) ? 0 : 1); rescue; exit 1; end"]
interval: 5s
timeout: 5s
retries: 5
start_period: 5s
configs:
fluentd_conf:
content: |
<source>
@type http
@id input_http
@label @mainstream
port 9880
bind 0.0.0.0
body_size_limit 32m
keepalive_timeout 10s
</source>
<source>
@type forward
@id input_forward
@label @mainstream
port 24224
bind 0.0.0.0
</source>
<label @mainstream>
<match **>
@type copy
<store>
@type file
@id output_file
path /fluentd/log/data.*.log
symlink_path /fluentd/log/data.log
append true
<buffer time>
timekey 1d
timekey_wait 10m
flush_mode immediate
</buffer>
</store>
<store>
@type stdout
@id output_stdout
</store>
</match>
</label>
volumes:
fluentd-log:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Fluentd is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 15 s: fluent/fluentd:v1.20.1-debian-1.0.
Based on the upstream setup. Official Docker image pinned to v1.20.1-debian-1.0 with HTTP and forward inputs, immediate file buffer flushing, and Ruby healthcheck.
fluentd-1 | 2026-11-01T19:41:00.299427758Z 2026-11-01 19:41:00 +0000 [info]: init supervisor logger path=nil rotate_age=nil rotate_size=nil
fluentd-1 | 2026-11-01T19:41:00.299709675Z 2026-11-01 19:41:00 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
fluentd-1 | 2026-11-01T19:41:00.299719341Z 2026-11-01 19:41:00 +0000 [info]: inaccessible include directory was specified path="/etc/fluent/conf.d"
fluentd-1 | 2026-11-01T19:41:00.301172175Z 2026-11-01 19:41:00 +0000 [info]: gem 'fluentd' version '1.20.1'
fluentd-1 | 2026-11-01T19:41:00.322781091Z 2026-11-01 19:41:00 +0000 [info]: using configuration file: <ROOT>
fluentd-1 | 2026-11-01T19:41:00.322797091Z <source>
fluentd-1 | 2026-11-01T19:41:00.322798008Z @type http
fluentd-1 | 2026-11-01T19:41:00.322798633Z @id input_http
fluentd-1 | 2026-11-01T19:41:00.322799216Z @label @mainstream
fluentd-1 | 2026-11-01T19:41:00.322799716Z port 9880
fluentd-1 | 2026-11-01T19:41:00.322800258Z bind "0.0.0.0"
fluentd-1 | 2026-11-01T19:41:00.322800841Z body_size_limit 32m
fluentd-1 | 2026-11-01T19:41:00.322801341Z keepalive_timeout 10s
fluentd-1 | 2026-11-01T19:41:00.322801841Z </source>
fluentd-1 | 2026-11-01T19:41:00.322802383Z <source>
fluentd-1 | 2026-11-01T19:41:00.322802925Z @type forward
fluentd-1 | 2026-11-01T19:41:00.322803383Z @id input_forward
fluentd-1 | 2026-11-01T19:41:00.322803883Z @label @mainstream
fluentd-1 | 2026-11-01T19:41:00.322804383Z port 24224
fluentd-1 | 2026-11-01T19:41:00.322804883Z bind "0.0.0.0"
fluentd-1 | 2026-11-01T19:41:00.322805383Z </source>
fluentd-1 | 2026-11-01T19:41:00.322805883Z <label @mainstream>
fluentd-1 | 2026-11-01T19:41:00.322806425Z <match **>
fluentd-1 | 2026-11-01T19:41:00.322806966Z @type copy
fluentd-1 | 2026-11-01T19:41:00.322807466Z <store>
fluentd-1 | 2026-11-01T19:41:00.322807966Z @type "file"
fluentd-1 | 2026-11-01T19:41:00.322808508Z @id output_file
fluentd-1 | 2026-11-01T19:41:00.322809050Z path "/fluentd/log/data.*.log"
fluentd-1 | 2026-11-01T19:41:00.322809633Z symlink_path "/fluentd/log/data.log"
fluentd-1 | 2026-11-01T19:41:00.322810216Z append true
fluentd-1 | 2026-11-01T19:41:00.322810716Z <buffer time>
fluentd-1 | 2026-11-01T19:41:00.322811258Z timekey 1d
fluentd-1 | 2026-11-01T19:41:00.322811716Z timekey_wait 10m
fluentd-1 | 2026-11-01T19:41:00.322812216Z flush_mode immediate
fluentd-1 | 2026-11-01T19:41:00.322812758Z path "/fluentd/log/data.*.log"
fluentd-1 | 2026-11-01T19:41:00.322813300Z </buffer>
fluentd-1 | 2026-11-01T19:41:00.322813883Z </store>
fluentd-1 | 2026-11-01T19:41:00.322814425Z <store>
fluentd-1 | 2026-11-01T19:41:00.322814883Z @type "stdout"
fluentd-1 | 2026-11-01T19:41:00.322815425Z @id output_stdout
fluentd-1 | 2026-11-01T19:41:00.322820425Z </store>
fluentd-1 | 2026-11-01T19:41:00.322820966Z </match>
fluentd-1 | 2026-11-01T19:41:00.322821508Z </label>
fluentd-1 | 2026-11-01T19:41:00.322822050Z </ROOT>
fluentd-1 | 2026-11-01T19:41:00.322822633Z 2026-11-01 19:41:00 +0000 [info]: starting fluentd-1.20.1 pid=7 ruby="3.4.12"
fluentd-1 | 2026-11-01T19:41:00.325331633Z 2026-11-01 19:41:00 +0000 [info]: spawn command to main: cmdline=["/usr/local/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/local/bundle/bin/fluentd", "--config", "/fluentd/etc/fluent.conf", "--plugin", "/fluentd/plugins", "--under-supervisor"]
fluentd-1 | 2026-11-01T19:41:00.501145425Z 2026-11-01 19:41:00 +0000 [info]: #0 init worker0 logger path=nil rotate_age=nil rotate_size=nil
fluentd-1 | 2026-11-01T19:41:00.501574258Z 2026-11-01 19:41:00 +0000 [info]: adding match in @mainstream pattern="**" type="copy"
fluentd-1 | 2026-11-01T19:41:00.517793550Z 2026-11-01 19:41:00 +0000 [info]: adding source type="http"
fluentd-1 | 2026-11-01T19:41:00.522037050Z 2026-11-01 19:41:00 +0000 [info]: adding source type="forward"
fluentd-1 | 2026-11-01T19:41:00.523698633Z 2026-11-01 19:41:00 +0000 [info]: #0 enabled Ruby JIT
fluentd-1 | 2026-11-01T19:41:00.523706591Z 2026-11-01 19:41:00 +0000 [info]: #0 starting fluentd worker pid=26 ppid=7 worker=0
fluentd-1 | 2026-11-01T19:41:00.524569550Z 2026-11-01 19:41:00 +0000 [info]: #0 [input_forward] listening port port=24224 bind="0.0.0.0"
fluentd-1 | 2026-11-01T19:41:00.525473050Z 2026-11-01 19:41:00 +0000 [info]: #0 fluentd worker is now running worker=0
fluentd-1 | 2026-11-01T19:41:03.231246218Z 2026-11-01 19:41:03.228080718 +0000 app.smoke: {"service":"fluentd-test","message":"verification-token-9880","level":"info"}
fluentd-1 | 2026-11-01T19:41:03.233181926Z 2026-11-01 19:41:03.232354968 +0000 app.smoke: {"event":"heartbeat","status":"ok"}