📝 Fluentd Cheatsheet Completo 📝

Fluentd es un colector de datos de código abierto que unifica la recopilación y el consumo de logs y datos de eventos para una mejor utilización y comprensión. Permite recolectar datos de diversas fuentes, filtrarlos, transformarlos y luego enviarlos a múltiples destinos.


1. 🌟 Conceptos Clave


2. 🛠️ Configuración Inicial y Ejecución

2.1. Instalación

2.2. Archivo de Configuración (fluent.conf o td-agent.conf)

# fluent.conf
# GLOBAL CONFIGURATION (Optional, but good practice)
<system>
  log_level debug # info, warn, error, debug, trace
  # root_dir /var/log/fluentd # Directorio de trabajo
  # ...
</system>

# 1. INPUT (SOURCE): Define cómo Fluentd recolecta los logs
<source>
  @type tail            # Plugin de entrada: lee desde el final de un archivo
  @id input_file_app_logs # ID único para este source
  path /var/log/app/*.log # Ruta de los archivos de log
  pos_file /var/log/fluentd/app_logs.pos # Archivo para guardar la posición de lectura (para reiniciar)
  tag app.web           # Etiqueta para los eventos de este source
  <parse>                # Parser: cómo Fluentd interpreta cada línea de log
    @type json          # Asume que las líneas de log son JSON
    time_key time       # Campo que contiene el timestamp
    time_format %Y-%m-%dT%H:%M:%S%z # Formato del timestamp
  </parse>
</source>

<source>
  @type http             # Plugin de entrada: recibe logs vía HTTP POST
  @id input_http_endpoint
  port 8888              # Puerto para escuchar
  bind 0.0.0.0           # Interfaz para escuchar
  body_size_limit 32m    # Tamaño máximo del cuerpo de la petición
  keepalive_timeout 10s
  tag http.data          # Etiqueta para los eventos HTTP
</source>

<source>
  @type forward          # Plugin de entrada: recibe logs de otros agentes Fluentd o clientes (TCP/UDP)
  @id input_forward_endpoint
  port 24224
  bind 0.0.0.0
</source>

# 2. FILTER: Transforma o filtra los logs. Se aplican en orden.
<filter app.web> # Este filtro se aplica a eventos con la etiqueta 'app.web'
  @type record_transformer # Plugin de filtro: añade/modifica campos en el registro
  <record>
    hostname "#{Socket.gethostname}" # Añade el hostname del servidor
    env "production"                 # Añade un campo estático
    log_level ${record["level"]}     # Extrae un campo existente (asume JSON de entrada con 'level')
  </record>
</filter>

<filter http.data>
  @type grep           # Plugin de filtro: filtra eventos basándose en patrones
  <exclude>             # Excluye eventos
    key message         # Campo a comprobar
    pattern /healthcheck/ # Excluye mensajes que contengan "healthcheck"
  </exclude>
  <regexp>              # Incluye eventos (si hay conflicto, exclude tiene prioridad)
    key status          # Campo a comprobar
    pattern /^(ERROR|WARN)$/ # Solo incluye los que tienen status ERROR o WARN
  </regexp>
</filter>

# 3. OUTPUT (MATCH): Define dónde Fluentd envía los logs.
# Cada <match> solo procesa los tags que coinciden con su patrón.
<match app.**> # Coincide con 'app.web', 'app.auth', etc. (cualquier tag que empiece con app.)
  @type elasticsearch # Plugin de salida: envía a Elasticsearch
  host elasticsearch.example.com # Host de Elasticsearch
  port 9200
  logstash_format true # Formato compatible con Logstash (índices diarios)
  logstash_prefix my-app-logs # Prefijo para el índice de Elasticsearch (my-app-logs-YYYY.MM.DD)
  include_tag_key true # Añadir el tag original como campo 'tag' en el JSON
  <buffer tag,time> # Buffer para este output
    @type file # Almacenar en disco si hay fallos o acumulación
    path /var/log/fluentd/buffer/app_es # Ruta del buffer
    chunk_limit_size 10m # Tamaño máximo del chunk en buffer
    flush_interval 5s    # Frecuencia de envío del buffer
    retry_limit 17 # Número de reintentos
    retry_wait 1s # Espera entre reintentos
  </buffer>
</match>

<match http.data>
  @type stdout # Plugin de salida: imprime los logs en la consola (para depuración)
  <format>
    @type json # Formato de salida JSON
  </format>
</match>

<match **> # Coincide con CUALQUIER tag que no haya sido procesado antes
  @type file
  path /var/log/fluentd/other-logs.log
  <format>
    @type json
  </format>
</match>

2.3. Ejecutar Fluentd

fluentd -c /path/to/fluent.conf -v # Inicia Fluentd con la configuración y verbosidad
# O si usas td-agent:
# sudo systemctl start td-agent
# sudo systemctl status td-agent

3. 🧩 Componentes Clave de Configuración

3.1. source (Input Plugins)

Definen cómo Fluentd ingesta los datos.

3.2. filter (Filter Plugins)

Modifican o transforman los eventos a medida que fluyen. Se aplican solo a los eventos con el tag que coincide.

3.3. match (Output Plugins)

Envían los eventos a destinos finales. Solo procesan los eventos con el tag que coincide.

3.4. parse (Parser Plugins)

Define cómo se analiza el formato de los datos de entrada dentro de un source.

3.5. buffer (Buffer Section)

Define cómo Fluentd almacena temporalmente los datos antes de enviarlos a la salida. Se configura dentro de un match.


4. 📝 Tags (Etiquetas)


5. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa de Fluentd, cubriendo sus conceptos esenciales, cómo configurarlo para inputs, filtros y outputs, los plugins comunes y las mejores prácticas para construir una tubería de gestión de logs robusta y eficiente.