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/log si 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.