Fluent Bit: Procesador de Logs Ligero
Fluent Bit es un procesador y reenviador de logs ultraligero escrito en C, diseñado para entornos con recursos limitados como contenedores, dispositivos IoT o nodos de Kubernetes. Con un consumo de memoria que ronda los 450 KB en operación normal, Fluent Bit puede recolectar, parsear, filtrar y enviar logs a múltiples destinos simultáneamente sin impactar el rendimiento de las aplicaciones. Esta guía cubre la instalación en Linux, configuración de plugins de entrada y salida, y la integración con Kubernetes y stacks de monitoreo.
Requisitos Previos
- Ubuntu 20.04/22.04, Debian 11+ o CentOS 8+/Rocky Linux 8+
- 64 MB de RAM (consumo real en producción: ~450 KB)
- Acceso a las fuentes de logs
- Permisos de lectura sobre
/var/logsi se procesan logs del sistema
Instalación de Fluent Bit
Instalación en Ubuntu/Debian
# Añadir clave GPG y repositorio oficial
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
# O manualmente:
curl -fsSL https://packages.fluentbit.io/fluentbit.key | sudo gpg --dearmor -o /usr/share/keyrings/fluentbit.gpg
echo "deb [signed-by=/usr/share/keyrings/fluentbit.gpg] https://packages.fluentbit.io/ubuntu/focal focal main" \
| sudo tee /etc/apt/sources.list.d/fluent-bit.list
sudo apt update && sudo apt install -y fluent-bit
# Habilitar e iniciar el servicio
sudo systemctl enable fluent-bit --now
sudo systemctl status fluent-bit
Instalación en CentOS/Rocky Linux
# Añadir repositorio
sudo tee /etc/yum.repos.d/fluent-bit.repo > /dev/null <<EOF
[fluent-bit]
name=Fluent Bit
baseurl=https://packages.fluentbit.io/centos/\$releasever/
gpgcheck=1
gpgkey=https://packages.fluentbit.io/fluentbit.key
enabled=1
EOF
sudo dnf install -y fluent-bit
sudo systemctl enable fluent-bit --now
Instalación con Docker
# Ejecutar Fluent Bit como contenedor
docker run -d \
--name fluent-bit \
-v /var/log:/var/log:ro \
-v /etc/fluent-bit/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf:ro \
fluent/fluent-bit:latest
Estructura de Configuración
El archivo de configuración principal es /etc/fluent-bit/fluent-bit.conf:
# /etc/fluent-bit/fluent-bit.conf
[SERVICE]
# Intervalo de flush hacia los destinos (segundos)
Flush 5
# Nivel de log: error, warn, info, debug, trace
Log_Level info
# Archivo de parsers externos
Parsers_File parsers.conf
# Habilitar métricas HTTP de Fluent Bit
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
[INPUT]
Name cpu
Tag metricas.cpu
Interval_Sec 1
[OUTPUT]
Name stdout
Match *
Format json_lines
Fluent Bit soporta un único archivo de configuración o múltiples archivos con directivas @INCLUDE:
# Incluir configuraciones adicionales
@INCLUDE inputs/*.conf
@INCLUDE filters/*.conf
@INCLUDE outputs/*.conf
Plugins de Entrada (Input)
# Leer archivos de log (tail)
[INPUT]
Name tail
Path /var/log/nginx/access.log
Tag nginx.access
# Seguir el archivo incluso cuando rota
Refresh_Interval 10
# Guardar posición para no releer tras reinicio
DB /var/lib/fluent-bit/nginx.db
# Parser a aplicar
Parser nginx
# Leer logs de contenedores Docker
[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
# Leer logs del sistema (systemd/journald)
[INPUT]
Name systemd
Tag systemd.*
Systemd_Filter _SYSTEMD_UNIT=nginx.service
Systemd_Filter _SYSTEMD_UNIT=postgresql.service
Read_From_Tail On
# Recolectar métricas del sistema
[INPUT]
Name cpu
Tag metricas.cpu
Interval_Sec 10
[INPUT]
Name mem
Tag metricas.memoria
Interval_Sec 10
[INPUT]
Name disk
Tag metricas.disco
Interval_Sec 30
Dev_Name sda
# Recibir logs por TCP/UDP (syslog)
[INPUT]
Name syslog
Listen 0.0.0.0
Port 5140
Mode tcp
Tag syslog.*
Parsers y Filtros
Define parsers en /etc/fluent-bit/parsers.conf:
# /etc/fluent-bit/parsers.conf
# Parser para logs de acceso de Nginx
[PARSER]
Name nginx
Format regex
Regex ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
# Parser para JSON genérico
[PARSER]
Name json
Format json
Time_Key timestamp
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
# Parser para Apache Combined Log
[PARSER]
Name apache
Format regex
Regex ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>.*)")?$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
# Parser para logs de Docker JSON
[PARSER]
Name docker
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
Filtros en el archivo de configuración principal:
# Añadir campos adicionales a todos los logs
[FILTER]
Name record_modifier
Match *
Record hostname ${HOSTNAME}
Record entorno produccion
# Filtrar eventos usando Lua
[FILTER]
Name lua
Match nginx.*
Script /etc/fluent-bit/scripts/filtrar_health.lua
Call filtrar_health_checks
# Modificar/añadir campos con grep
[FILTER]
Name grep
Match nginx.access
# Solo mantener errores HTTP 4xx y 5xx
Regex code ^[45]
# Modificar campos con nest (anidar datos)
[FILTER]
Name nest
Match *
Operation nest
Wildcard metricas.*
Nest_under metricas
Add_prefix campo_
Script Lua para filtros complejos (/etc/fluent-bit/scripts/filtrar_health.lua):
-- Filtrar peticiones de health check para reducir ruido
function filtrar_health_checks(tag, timestamp, record)
local path = record["path"]
-- Devolver -1 descarta el evento, 0 lo mantiene sin cambios
if path == "/health" or path == "/ping" or path == "/favicon.ico" then
return -1, timestamp, record
end
return 0, timestamp, record
end
Plugins de Salida (Output)
# Enviar a Loki (Grafana)
[OUTPUT]
Name loki
Match nginx.*
Host loki
Port 3100
Labels job=nginx,host=${HOSTNAME}
Label_Keys $code,$method
# Enviar a Elasticsearch
[OUTPUT]
Name es
Match *
Host elasticsearch
Port 9200
Index fluent-bit-logs
Type _doc
# Usar fecha en el nombre del índice
Logstash_Format On
Logstash_Prefix logs-nginx
# Autenticación básica
HTTP_User elastic
HTTP_Passwd contraseña_elastic
tls Off
# Enviar a S3
[OUTPUT]
Name s3
Match *
bucket mi-bucket-logs
region eu-west-1
s3_key_format /fluent-bit/%Y/%m/%d/$UUID.gz
compression gzip
upload_timeout 10m
# Enviar a stdout para depuración
[OUTPUT]
Name stdout
Match *
Format json_lines
# Reenviar a Fluentd o a otra instancia de Fluent Bit
[OUTPUT]
Name forward
Match *
Host fluentd-aggregator
Port 24224
Integración con Kubernetes
En Kubernetes, Fluent Bit se despliega como DaemonSet para recolectar logs de todos los nodos:
# Instalar Fluent Bit en Kubernetes con Helm
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
# Instalar con valores por defecto
helm install fluent-bit fluent/fluent-bit \
--namespace logging \
--create-namespace
# Instalar con configuración personalizada
helm install fluent-bit fluent/fluent-bit \
--namespace logging \
--create-namespace \
-f valores-fluent-bit.yaml
Archivo valores-fluent-bit.yaml para enviar logs a Loki:
config:
inputs: |
[INPUT]
Name tail
Path /var/log/containers/*.log
multiline.parser docker, cri
Tag kube.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
filters: |
[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
Merge_Log On
K8S-Logging.Parser On
K8S-Logging.Exclude On
outputs: |
[OUTPUT]
Name loki
Match kube.*
Host loki.logging.svc.cluster.local
Port 3100
Labels job=fluent-bit,namespace=$kubernetes['namespace_name'],pod=$kubernetes['pod_name']
Auto_Kubernetes_Labels On
Solución de Problemas
Fluent Bit no lee los archivos de log:
# Verificar permisos del proceso
sudo -u fluent-bit ls -la /var/log/nginx/
# Añadir fluent-bit al grupo adm
sudo usermod -aG adm fluent-bit
sudo systemctl restart fluent-bit
Logs duplicados tras reinicio:
# Verificar que el parámetro DB está configurado en el input tail
# Esto guarda la posición de lectura en un archivo SQLite
[INPUT]
Name tail
Path /var/log/app.log
DB /var/lib/fluent-bit/app.db
Errores de conexión al destino:
# Revisar logs del servicio
sudo journalctl -u fluent-bit -f
# Probar conectividad al destino
curl -v http://loki:3100/ready
Alto consumo de memoria:
# Limitar el buffer de memoria en el input
[INPUT]
Name tail
Path /var/log/app.log
Mem_Buf_Limit 10MB
Skip_Long_Lines On
Ver métricas internas de Fluent Bit:
# Si HTTP_Server está activado en [SERVICE]
curl http://localhost:2020/api/v1/metrics | python3 -m json.tool
curl http://localhost:2020/api/v1/health
Conclusión
Fluent Bit es la elección ideal cuando se necesita un agente de logs con un impacto mínimo en el sistema, especialmente en entornos Kubernetes donde corre en cada nodo del clúster. Su amplio ecosistema de plugins de entrada y salida permite integrarlo con prácticamente cualquier stack de observabilidad, desde Loki y Elasticsearch hasta Datadog o S3. La clave para un deployment exitoso es definir parsers correctos desde el inicio y configurar los filtros para reducir el volumen de datos antes de enviarlo a los destinos.


