Complete fluentbit toolkit with generation and validation capabilities
92
92%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
Identify the following before generating:
Use AskUserQuestion if key information is missing.
python3 scripts/generate_config.py --helpSupported use cases: kubernetes-elasticsearch, kubernetes-loki, kubernetes-cloudwatch, kubernetes-opentelemetry, application-multiline, syslog-forward, file-tail-s3, http-kafka, multi-destination, prometheus-metrics, lua-filtering, stream-processor, custom
python3 scripts/generate_config.py --use-case kubernetes-elasticsearch --output fluent-bit.conf
python3 scripts/generate_config.py --use-case kubernetes-opentelemetry --cluster-name my-cluster --output fluent-bit.confState explicitly why the script was not used (e.g., "Manual generation chosen because grep filter for log levels is not supported by the script").
Before writing any manual config:
examples/ — production-ready reference configs are available for all 13 use cases (e.g. kubernetes-elasticsearch.conf, kubernetes-loki.conf, application-multiline.conf, multi-destination.conf, full-production.conf, and others).examples/parsers.conf — reuse existing parsers (docker, cri, json, nginx, apache, syslog-rfc3164/5424, multiline-java/python/go/ruby) before creating custom ones.Manual configuration structure (fluent-bit.conf + optional parsers.conf):
# ── SERVICE ─────────────────────────────────────────────────────────────────
[SERVICE]
Flush 1 # seconds; lower=lower latency, higher CPU
Daemon Off # Off in containers
Log_Level info # info for prod, debug for troubleshooting
Parsers_File parsers.conf
HTTP_Server On # enables /api/v1/health for K8s probes
HTTP_Listen 0.0.0.0
HTTP_Port 2020
storage.metrics on
# ── INPUT ────────────────────────────────────────────────────────────────────
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Exclude_Path /var/log/containers/*fluent-bit*.log
Parser docker
DB /var/log/flb_kube.db # position tracking across restarts
Mem_Buf_Limit 50MB # always set to prevent OOM
Skip_Long_Lines On
Refresh_Interval 10
# ── FILTER ───────────────────────────────────────────────────────────────────
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.
Merge_Log On
Keep_Log Off
K8S-Logging.Parser On
K8S-Logging.Exclude On
Labels On
Annotations Off
[FILTER]
Name modify
Match *
Add cluster_name my-cluster
Add environment production
# ── OUTPUT ───────────────────────────────────────────────────────────────────
[OUTPUT]
Name es
Match *
Host elasticsearch.logging.svc
Port 9200
Logstash_Format On
Logstash_Prefix k8s
Retry_Limit 3
storage.total_limit_size 5M
tls On
tls.verify OnCommon FILTER patterns (use as needed, order matters — parsers before modifiers):
# Parse structured fields from a log key
[FILTER]
Name parser
Match *
Key_Name log
Parser json
Reserve_Data On
# Include/exclude by field value
[FILTER]
Name grep
Match *
Regex level (error|fatal|critical)
Exclude path /health
# Multi-line (stack traces)
[FILTER]
Name multiline
Match *
multiline.key_content log
multiline.parser java, python, go
# Lua custom scripting
[FILTER]
Name lua
Match *
script /fluent-bit/scripts/filter.lua
call process_record
# Throttle (rate limiting)
[FILTER]
Name throttle
Match *
Rate 1000
Window 5
Interval 1mCommon OUTPUT patterns:
# Grafana Loki
[OUTPUT]
Name loki
Match *
Host loki.default.svc
Port 3100
labels job=fluent-bit, namespace=$kubernetes['namespace_name'], pod=$kubernetes['pod_name']
label_keys $stream
remove_keys kubernetes,stream
auto_kubernetes_labels on
line_format json
Retry_Limit 3
# AWS S3
[OUTPUT]
Name s3
Match *
bucket my-logs-bucket
region us-east-1
total_file_size 100M
upload_timeout 10m
compression gzip
s3_key_format /fluent-bit-logs/%Y/%m/%d/$TAG[0]/%H-%M-%S-$UUID.gz
Retry_Limit 3
# Kafka
[OUTPUT]
Name kafka
Match *
Brokers kafka-broker-1:9092,kafka-broker-2:9092
Topics logs
Format json
Timestamp_Key @timestamp
Retry_Limit 3
# AWS CloudWatch Logs
[OUTPUT]
Name cloudwatch_logs
Match *
region us-east-1
log_group_name /aws/fluent-bit/logs
log_stream_prefix from-fluent-bit-
auto_create_group On
Retry_Limit 3
# OpenTelemetry (OTLP/HTTP)
[OUTPUT]
Name opentelemetry
Match *
Host opentelemetry-collector.observability.svc
Port 4318
logs_uri /v1/logs
add_label cluster my-cluster
add_label environment production
tls On
tls.verify On
Retry_Limit 3
# HTTP endpoint
[OUTPUT]
Name http
Match *
Host logs.example.com
Port 443
URI /api/logs
Format json
tls On
tls.verify On
Header Authorization Bearer ${API_TOKEN}
Compress gzip
Retry_Limit 3
# stdout (debug only)
[OUTPUT]
Name stdout
Match *
Format json_linesPlugin documentation lookup (when needed for unfamiliar plugins):
mcp__context7__resolve-library-id with "fluent-bit", then mcp__context7__get-library-docs with the plugin topic."fluent-bit" "<plugin-type>" "<plugin-name>" "configuration" site:docs.fluentbit.ioSyntax check before finalizing:
[SECTION] formatMatch tags are consistent with Tag values on inputsparsers.conf or Parsers_FileInvoke devops-skills:fluentbit-validator on the generated config to run:
fluent-bit binary is availableFix any reported issues and re-validate until all checks pass.
When delivering a configuration:
${ENV_VAR} syntax, never hardcode secretstls.verify On in production; if Off is needed add an inline comment explaining why (e.g., # Internal cluster with self-signed certs)| Concern | Recommendation |
|---|---|
| OOM prevention | Mem_Buf_Limit 50MB on every tail input |
| Crash recovery | DB /var/log/flb_kube.db on tail inputs |
| Log loops | Exclude_Path *fluent-bit*.log |
| Credentials | ${ENV_VAR} only, never hardcode |
| TLS | tls On + tls.verify On in production |
| Retries | Retry_Limit 3-5 on all outputs |
| Disk buffer | storage.total_limit_size to prevent exhaustion |
| Health checks | HTTP_Server On, probe GET :2020/api/v1/health |
| Bandwidth | Enable compression gzip on network outputs |
| Structured logs | Prefer JSON app logs; use Merge_Log On in K8s filter |
Match * on all output plugins simultaneouslyMatch *.kube.*, app.*, system.*) and route each namespace to its intended destination with a specific Match pattern.Mem_Buf_Limit on INPUT plugins[INPUT] Name tail Tag app.* with no Mem_Buf_Limit setting.Mem_Buf_Limit 50MB to every tail input (adjust the value based on measured log volume).Retry_Limit False in outputs without monitoringRetry_Limit False in an output plugin with no alerting on delivery failure metrics.Retry_Limit 5 and monitor for delivery failures using Fluent Bit's built-in Prometheus metrics (/api/v1/metrics).json or logfmt parsers applyParser regex_json configured to extract fields from JSON-formatted log lines.Parser json — simpler, faster, and guaranteed to handle all valid JSON log output correctly.fluent-bit.confHTTP_Passwd secretpassword written directly in the config file.HTTP_Passwd ${LOKI_PASSWORD} — and inject the value at runtime via Kubernetes secrets or a secrets manager.| Resource | Purpose |
|---|---|
scripts/generate_config.py | Template-based config generation (13 use cases) |
examples/*.conf | Production-ready reference configurations |
examples/parsers.conf | Reusable parser library |
| docs.fluentbit.io | Official plugin reference |
context7 /fluent/fluent-bit-docs | MCP-accessible documentation |