Graylog: Guía práctica de configuración y empleo

Centraliza, analiza y alerta sobre tus logs con una plataforma rápida, extensible y amigable. Esta guía parte del artículo de DesdeLinux y lo actualiza con prácticas modernas (Docker Compose, pipelines, seguridad y operación).

Graylog Logs SIEM ligero DevOps Observabilidad

1) ¿Qué es Graylog y cómo funciona?

Componentes básicos

  • Graylog Server: ingesta, procesamiento, reglas/pipelines y API/UI.
  • Data node: OpenSearch o Elasticsearch para indexar/buscar mensajes.
  • MongoDB: metadatos y configuración (no almacena los logs).

Diseño escalable: CPU para Graylog; RAM/IO para el data node; MongoDB con requisitos modestos.

Flujo de procesamiento

  1. Inputs reciben mensajes (Syslog, GELF, Beats, HTTP…)
  2. Extractores y pipelines normalizan/enriquecen campos.
  3. Streams enrutan en tiempo real a categorías (por app, entorno, severidad, etc.).
  4. Dashboards y alertas para visualización y respuesta.

Graylog destaca como centro único de logs (syslog crudo o estructuras personalizadas) con búsquedas potentes y depuración fina en entornos distribuidos.

2) Despliegue recomendado (Docker Compose)

Recomendación actual: usa Docker Compose para entornos de prueba/piloto y como base de producción (ajustando volúmenes, memoria, TLS y alta disponibilidad).

# docker-compose.yml (ejemplo mínimo educativo)
services:
  mongo:
    image: mongo:6
    restart: unless-stopped
    volumes:
      - mongo_data:/data/db

  opensearch:
    image: opensearchproject/opensearch:2
    environment:
      - discovery.type=single-node
      - "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g"
    ulimits:
      memlock: { soft: -1, hard: -1 }
      nofile: { soft: 65536, hard: 65536 }
    restart: unless-stopped
    volumes:
      - os_data:/usr/share/opensearch/data

  graylog:
    image: graylog/graylog:5
    depends_on: [mongo, opensearch]
    environment:
      GRAYLOG_NODE_ID_FILE: /usr/share/graylog/data/config/node-id
      GRAYLOG_PASSWORD_SECRET: "$(openssl rand -base64 32)"
      GRAYLOG_ROOT_PASSWORD_SHA2: "$(echo -n "TuPasswordFuerte" | sha256sum | cut -d" " -f1)"
      GRAYLOG_HTTP_EXTERNAL_URI: http://:9000/
      GRAYLOG_ELASTICSEARCH_HOSTS: http://opensearch:9200
    ports:
      - "9000:9000"   # UI/API
      - "12201:12201/udp" # GELF UDP (opcional)
      - "1514:1514/udp"   # Syslog UDP (opcional)
    restart: unless-stopped
    volumes:
      - gl_data:/usr/share/graylog/data

volumes:
  mongo_data:
  os_data:
  gl_data:
# Levantar el stack
docker compose up -d

# Acceso
# Navega a: http://:9000
# Usuario: admin  (cambia la contraseña tras el primer login)

Para producción: separa nodos (Graylog / OpenSearch / MongoDB), configura TLS, ajusta JVM/heap y prepara copias de seguridad y retenciones.

3) (Opcional) Instalación clásica en Linux

El artículo de DesdeLinux describe una instalación tradicional (paquetes + Java + MongoDB + Elasticsearch + Graylog). Si necesitas este enfoque, valida versiones soportadas y repositorios actuales antes de instalar. En general:

  1. Instala Java (JRE/JDK actualizado).
  2. Instala y habilita MongoDB.
  3. Instala y configura OpenSearch o Elasticsearch (asigna nombre de clúster, heap, almacenamiento rápido).
  4. Instala graylog-server, genera password_secret y root_password_sha2, adapta rest_listen_uri/http_external_uri y abre puertos UI/inputs.

Nota: los comandos y versiones del artículo original pueden estar desactualizados (p. ej., ES 5.x y MongoDB 3.6). Emplea versiones soportadas por tu release de Graylog y distribución.

4) Configuración inicial de Graylog

4.1 Crear inputs

  1. Menú System → InputsLaunch new input.
  2. Elige un tipo (p. ej., Syslog UDP, GELF TCP/UDP, Beats, HTTP).
  3. Define puerto/codec y bind address; guarda.

Para agentes: usa Graylog Sidecar (gestiona Filebeat/Winlogbeat a escala) o envía GELF desde tus aplicaciones.

4.2 Streams (enrutado)

Los streams clasifican mensajes en tiempo real mediante reglas (ej.: source:api-*, env:prod, level>=ERROR). Úsalos para aislar apps/entornos y disparar alertas.

4.3 Extractores (en el input)

Permiten extraer campos a partir de texto crudo (grok/regex, corte delimitado, JSON, key=value). Ideales para normalizar syslog o logs heredados.

4.4 Pipelines (reglas)

// Ejemplo: normaliza severidad y enriquece con ambiente
rule "normaliza_severidad"
when has_field("level")
then
  let lvl = to_long($message.level);
  set_field("severity", case(
    lvl >= 50, "CRITICAL",
    lvl >= 40, "ERROR",
    lvl >= 30, "WARN",
    lvl >= 20, "INFO",
    "DEBUG"));
  set_field("env", "prod");
end

Asocia la pipeline a un stream para que se aplique sólo a sus mensajes.

5) Búsqueda, paneles y alertas

5.1 Búsquedas

  • Consulta rápida: env:prod AND severity:ERROR
  • Rangos de tiempo relativos/absolutos, guardado de búsquedas.
  • Agregaciones: group by campos, percentiles, conteos.

5.2 Dashboards

  • Widgets: histogramas por severidad, top source, latency percentiles.
  • Filtros y variables (app, entorno) para paneles reutilizables.

5.3 Alertas

  • Define event definitions (umbral, ausencia de logs, patrón de error).
  • Notificaciones: email, webhooks, Slack, etc.
  • Corrige ruido con agregación por ventanas (p. ej., “>=50 errores/5min”).

5.4 Buenas prácticas de consultas

  • Prefiere campos keyword para igualdad; usa .text para full-text.
  • Limita el tiempo y el número de resultados; apóyate en agregaciones.

6) Retención, archivado y costes

7) Seguridad y cumplimiento

8) Operación y escalado

TareaConsejo
Tamaño de heapGraylog: ~60–80% de la RAM del contenedor/vm asignada al proceso; Data node: ~50% (deja caché al SO).
AlmacenamientoNVMe/SSD para índices; separa volúmenes de datos y logs del sistema.
Alta disponibilidad≥2 nodos Graylog detrás de balanceador; data node en clúster; MongoDB replicaset.
ThroughputDivide inputs por tipo/fuente; usa pipelines ligeras; evita regex costosos.
BackupsRespalda MongoDB (metadatos) y snapshots del data node; documenta recuperación.

9) Ejemplos rápidos

9.1 Input GELF UDP (aplicaciones)

  1. System → InputsGELF UDP (puerto 12201).
  2. En tu app (ej. logger GELF): apunta a graylog:12201.

9.2 Extractor grok (Nginx)

%{IPORHOST:clientip} - %{DATA:user} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:response} %{NUMBER:bytes}

9.3 Reglas de pipeline (enriquecimiento simple)

rule "marca_errores_5xx"
when to_int($message.response) >= 500
then
  set_field("is_error", true);
  set_field("service", "nginx");
end

10) Checklist de producción

Referencias y lecturas