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
- Inputs reciben mensajes (Syslog, GELF, Beats, HTTP…)
- Extractores y pipelines normalizan/enriquecen campos.
- Streams enrutan en tiempo real a categorías (por app, entorno, severidad, etc.).
- 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:
- Instala Java (JRE/JDK actualizado).
- Instala y habilita MongoDB.
- Instala y configura OpenSearch o Elasticsearch (asigna nombre de clúster, heap, almacenamiento rápido).
- Instala graylog-server, genera
password_secretyroot_password_sha2, adaptarest_listen_uri/http_external_uriy 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
- Menú System → Inputs → Launch new input.
- Elige un tipo (p. ej., Syslog UDP, GELF TCP/UDP, Beats, HTTP).
- 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
.textpara full-text. - Limita el tiempo y el número de resultados; apóyate en agregaciones.
6) Retención, archivado y costes
- Define índices por criticidad/tiempo (prod vs. dev) y tamaños de segmento prudentes.
- Políticas de retención por días o por tamaño; rota y elimina automáticamente.
- Exporta a almacenamiento económico (archivado) si requieres retención prolongada.
7) Seguridad y cumplimiento
- TLS en todo: UI/API y entradas (GELF/Beats/HTTP) con certificados válidos.
- RBAC y carpetas por equipo/área; evita cuentas compartidas.
- Hardening: restringe puertos de inputs, red interna para OpenSearch/MongoDB.
- Auditoría: registra cambios de configuración y accesos.
8) Operación y escalado
| Tarea | Consejo |
|---|---|
| Tamaño de heap | Graylog: ~60–80% de la RAM del contenedor/vm asignada al proceso; Data node: ~50% (deja caché al SO). |
| Almacenamiento | NVMe/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. |
| Throughput | Divide inputs por tipo/fuente; usa pipelines ligeras; evita regex costosos. |
| Backups | Respalda MongoDB (metadatos) y snapshots del data node; documenta recuperación. |
9) Ejemplos rápidos
9.1 Input GELF UDP (aplicaciones)
- System → Inputs → GELF UDP (puerto
12201). - 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
- ☑ Cambiaste
password_secrety la contraseña deadmin. - ☑ Configuraste TLS (UI e inputs).
- ☑ Definiste streams, pipelines y alertas básicas.
- ☑ Estableciste retención y backups.
- ☑ Monitorizas uso de disco/heap y salud del clúster.
Referencias y lecturas
- Artículo base: DesdeLinux: Graylog – administración y análisis de registros
- Documentación oficial de Graylog (instalación, arquitectura, conceptos).