main content
< Volver a blog sobre aplicaciones móviles

Logging centralizado trazabilidad distribuida aplicación web

Por qué necesitas centralizar los logs (y por qué urgía hacerlo ayer)

Seamos sinceros: cuando tu aplicación web a medida tiene un solo servidor, mirar los logs es abrir un archivo y buscar la línea que falla. No es elegante, pero funciona. El problema llega cuando la cosa crece. De repente tienes tres servidores, un par de workers procesando tareas en segundo plano, una API que habla con otros servicios y un contenedor por aquí que nadie recuerda haber desplegado. Ahora diagnosticar un problema significa conectarte a cada máquina por SSH, buscar entre archivos enormes y rezar para dar con la línea correcta antes de que el cliente vuelva a llamar.

Un sistema de logging centralizado acaba con ese dolor de cabeza. Recoge todos los registros en un único sitio donde puedes buscar, filtrar y cruzar datos en segundos. Para aplicaciones web desarrolladas a medida, donde la arquitectura suele incluir APIs propias, bases de datos variadas, colas de mensajes y servicios de terceros, centralizar los logs no es algo que puedas postponer indefinidamente. Es una necesidad desde el momento en que pones tu aplicación en producción.

Las ventajas son tangibles: reduces el tiempo que tardas en resolver incidencias (ese famoso MTTR), puedes auditar qué ha pasado en el sistema sin pedirle a nadie que busque manualmente, y eres capaz de generar alertas antes de que un error menor se convierta en una caída que afecte a todos tus usuarios.

ELK Stack: el estándar que todo el mundo conoce

Si preguntas a cualquier equipo de operaciones qué usan para centralizar logs, la respuesta más frecuente sigue siendo ELK: Elasticsearch, Logstash y Kibana. Cada pieza hace lo suyo:

  • Elasticsearch se encarga de almacenar e indexar los logs. Puedes buscar texto completo en terabytes de datos y obtener resultados en milisegundos.
  • Logstash es el pipeline de ingesta: recibe logs de múltiples fuentes, los transforma (parsea, enriquece, filtra lo que sobra) y los manda a Elasticsearch.
  • Kibana te da una interfaz web donde explorar los datos, montar dashboards y configurar alertas visuales.

En la vida real, muchos equipos sustituyen Logstash por Filebeat como agente ligero en cada servidor, y dejan Logstash solo para transformaciones complejas. Esta variante se conoce como EFK y reduce bastante el consumo de recursos en los servidores de aplicación.

Cuánto hierro necesitas al principio

Para una aplicación web a medida de tamaño medio, digamos entre 50 y 200 peticiones por segundo, un clúster de Elasticsearch con tres nodos suele ser más que suficiente para arrancar. Cada nodo debería tener al menos 16 GB de RAM y discos SSD para los índices activos. Los índices antiguos puedes moverlos a almacenamiento más barato con las políticas de ILM (Index Lifecycle Management) de Elasticsearch.

Alternativas que merece la pena conocer

ELK no es la única opción. Dependiendo de tu situación, quizá te encaje mejor otra cosa:

Solución Lo mejor que tiene Lo que hay que tener en cuenta
Grafana Loki Almacenamiento muy eficiente, no indexa todo el contenido Las búsquedas de texto libre son menos potentes que en Elasticsearch
Datadog SaaS gestionado, métricas y APM integrados El coste se dispara con volúmenes medios-altos
Graylog Interfaz intuitiva, alertas nativas que funcionan bien Ecosistema de plugins más pequeño que ELK
AWS CloudWatch Logs Se integra de forma nativa con todo lo de AWS Te ata al proveedor, y el coste es difícil de predecir
Google Cloud Logging Integración con GCP, consultas tipo SQL Fuera del ecosistema Google, poco útil

Si ya usas Grafana para métricas, Loki es la extensión natural. Si no quieres gestionar infraestructura de logging, Datadog o las soluciones cloud nativas te quitan ese peso de encima a cambio de una factura mensual.

Logging estructurado: el cimiento de todo lo demás

Antes de centralizar nada, asegúrate de que los logs están bien escritos. El logging estructurado significa emitir los registros en un formato que las máquinas puedan parsear fácilmente, normalmente JSON, en lugar de líneas de texto libre que solo un humano con paciencia puede interpretar.

Un log sin estructurar tiene esta pinta:

2026-07-03 14:23:01 ERROR - Failed to process order 45892 for user john@example.com: timeout connecting to payment gateway

El mismo evento como log estructurado:

{
  "timestamp": "2026-07-03T14:23:01.342Z",
  "level": "ERROR",
  "service": "order-service",
  "message": "Failed to process order",
  "order_id": 45892,
  "user_email": "john@example.com",
  "error_type": "timeout",
  "dependency": "payment-gateway",
  "correlation_id": "abc-123-def-456"
}

Con la versión estructurada puedes filtrar por cualquier campo, sacar métricas sobre tipos de error y cruzar eventos relacionados usando el correlation_id. En aplicaciones a medida, donde los flujos de negocio son específicos de cada proyecto, esto marca una diferencia brutal a la hora de depurar.

Niveles de log: cuándo usar cada uno sin volverse loco

Definir bien cuándo toca cada nivel te ahorra tanto el exceso de ruido como quedarte sin información cuando la necesitas:

  • TRACE: detalle máximo, solo para desarrollo. Si lo activas en producción, te vas a arrepentir.
  • DEBUG: información útil para investigar problemas concretos. Se puede activar puntualmente en producción cuando hace falta.
  • INFO: eventos relevantes del flujo normal (servicio arrancado, proceso completado, conexión establecida).
  • WARN: cosas que no deberían pasar pero que no impiden funcionar (reintentos, valores por defecto aplicados, recursos cerca del límite).
  • ERROR: fallos que impiden completar una operación concreta pero no tumban el servicio entero.
  • FATAL: fallos que provocan la parada del servicio o la pérdida de datos.

Una regla que funciona bien: si alguien del equipo de operaciones recibe una alerta de un WARN a las tres de la mañana y resulta que no era nada importante, ese log debería haber sido INFO o DEBUG.

Correlation IDs: el hilo que lo conecta todo

En una aplicación web con varios servicios, una petición del usuario puede pasar por el API gateway, el servicio de autenticación, el servicio de negocio, la base de datos y un servicio de notificaciones. Sin un identificador que las conecte, reconstruir el camino completo de esa petición es como buscar una aguja en un pajar.

El correlation ID es un identificador único que se genera cuando llega la petición y se propaga a todos los servicios por los que pasa. Cada log incluye ese ID, así que puedes filtrar en tu sistema de logging centralizado y ver de golpe todos los eventos relacionados con una misma interacción.

Implementarlo es bastante directo:

  1. Genera un UUID en el primer servicio que recibe la petición (o usa el que mande el cliente en una cabecera HTTP como X-Request-ID).
  2. Incluye ese ID en todas las llamadas entre servicios: cabeceras HTTP, metadatos de mensajes en colas, contexto de ejecución.
  3. Inyéctalo automáticamente en cada línea de log con un middleware o interceptor, para que los desarrolladores no tengan que acordarse de ponerlo a mano.

Trazabilidad distribuida con OpenTelemetry

Los correlation IDs te dan una visión básica del recorrido de una petición. La trazabilidad distribuida (distributed tracing) va un paso más allá y te ofrece una representación completa y temporal de todo el flujo, con tiempos de cada operación incluidos.

OpenTelemetry se ha convertido en el estándar de facto. Es un proyecto open source de la CNCF que unifica la recolección de trazas, métricas y logs bajo una misma API y un mismo SDK. Ya no necesitas elegir entre cinco librerías de instrumentación distintas.

Los conceptos que importan

  • Trace: el recorrido completo de una petición a través de todos los servicios.
  • Span: una operación individual dentro de un trace (una llamada HTTP, una consulta a base de datos, una operación de negocio).
  • Context propagation: el mecanismo que transmite el identificador del trace entre servicios.

Cómo implementarlo en la práctica

  1. Instala el SDK de OpenTelemetry para tu lenguaje (hay para Java, Python, Node.js, Go, .NET, PHP, Ruby y otros).
  2. Configura la instrumentación automática, que captura trazas de frameworks HTTP, clientes de base de datos y librerías de mensajería sin que tengas que tocar el código de negocio.
  3. Añade instrumentación manual para las operaciones de negocio importantes, creando spans personalizados que reflejen los pasos de tu dominio.
  4. Exporta las trazas a un backend compatible: Jaeger, Zipkin, Grafana Tempo o cualquier plataforma que soporte OTLP.

Jaeger o Zipkin: cuál elegir

Ambas son plataformas open source para almacenar y visualizar trazas distribuidas:

  • Jaeger, desarrollado originalmente por Uber, tiene una interfaz de búsqueda potente, soporte nativo para OpenTelemetry y escala horizontalmente con Elasticsearch o Cassandra como backend.
  • Zipkin, creado por Twitter, es más simple y consume menos recursos, pero sus funcionalidades de consulta se quedan más cortas.

Si empiezas de cero, Jaeger con OpenTelemetry es la combinación que más futuro tiene. Si buscas algo ligero para un proyecto pequeño, Zipkin puede ser suficiente.

Políticas de retención: cuánto guardas y cuánto te cuesta

Los logs ocupan espacio, y ese espacio sale de tu bolsillo. Necesitas una política de retención que encuentre el equilibrio entre tener información histórica disponible y no arruinarte en almacenamiento:

  • Logs de aplicación (INFO y superiores): entre 30 y 90 días en almacenamiento rápido (SSD, índices activos de Elasticsearch).
  • Logs de acceso HTTP: entre 90 días y 1 año, dependiendo de tus requisitos de auditoría.
  • Logs de depuración (DEBUG/TRACE): como mucho 7 días, y solo cuando los activas a propósito.
  • Trazas distribuidas: entre 15 y 30 días para el detalle completo, conservando las agregaciones estadísticas durante más tiempo.

En ELK Stack, las políticas de ILM te permiten mover índices viejos de nodos calientes (SSD) a nodos tibios (HDD) y finalmente a almacenamiento en frío (snapshots en S3 o similar). Con este enfoque puedes reducir los costes de almacenamiento entre un 70% y un 80% sin perder la posibilidad de consultar datos antiguos si hace falta.

Lo que dice el RGPD sobre tus logs (y lo que la AEPD espera de ti)

Este punto es importante y mucha gente lo pasa por alto. Los logs de tu aplicación web pueden contener datos personales: direcciones IP, correos electrónicos, identificadores de usuario, e incluso datos de negocio sensibles que aparecen en mensajes de error.

Tus obligaciones principales bajo el RGPD son:

  • Minimización: registra solo lo estrictamente necesario. No vuelques objetos de usuario enteros en los logs cuando te basta con un ID.
  • Pseudonimización: cuando sea posible, sustituye datos identificativos por tokens o hashes. Mejor guardar un hash del email que el email en claro.
  • Control de acceso: limita quién puede consultar logs con datos personales. Kibana permite configurar roles y espacios con permisos granulares.
  • Derecho de supresión: si un usuario ejerce su derecho al olvido, los logs con sus datos deben poder eliminarse o anonimizarse. Esto es técnicamente complicado en Elasticsearch, así que mejor diseñar los logs con pseudonimización desde el principio.
  • Base jurídica: puedes ampararte en el interés legítimo para el tratamiento de datos personales en logs orientados a la seguridad del sistema, pero necesitas documentarlo en tu Registro de Actividades de Tratamiento.

Consulta las guías de la Agencia Española de Protección de Datos (AEPD) para asegurarte de que cumples con todo.

Alertas: que los logs te avisen antes de que llame el cliente

Un sistema de logging centralizado sin alertas es como poner cámaras de seguridad y no mirar nunca las pantallas. Las alertas convierten los logs en acción.

Qué tipos de alertas necesitas

  • Por umbral: saltan cuando el número de errores por minuto supera un límite. Ideales para detectar picos de fallos.
  • Por anomalía: detectan desviaciones del comportamiento habitual, como que el tiempo de respuesta medio se triplique o aparezca un tipo de error que nunca se había visto.
  • Por ausencia: saltan cuando algo que debería haber pasado no pasa. Por ejemplo, si el proceso de facturación nocturna no emite su log de finalización antes de las 06:00.

Cómo evitar la fatiga de alertas

  • Cada alerta debe requerir una acción concreta. Si una alerta se ignora sistemáticamente, hay que quitarla o reclasificarla.
  • Define un runbook asociado a cada alerta: qué mirar, qué comprobar, a quién avisar si no se resuelve.
  • Usa los canales de notificación adecuados: Slack o email para cosas de baja prioridad, PagerDuty o llamada telefónica para incidencias críticas en mitad de la noche.

Tu hoja de ruta para montar todo esto

Si estás desarrollando una aplicación web a medida y quieres implementar logging centralizado desde cero, estos son los pasos en un orden que tiene sentido:

  1. Adopta logging estructurado en toda la aplicación, emitiendo logs en JSON con campos estandarizados.
  2. Define un esquema de campos común para todos los servicios: timestamp, level, service, message y correlation_id como mínimo.
  3. Despliega el stack de logging: empieza con una instalación sencilla de ELK o Grafana Loki en un entorno de staging.
  4. Configura los agentes recolectores (Filebeat, Fluentd o el collector de OpenTelemetry) en cada servicio.
  5. Crea dashboards operativos en Kibana o Grafana: tasa de errores por servicio, latencia de peticiones, eventos de negocio clave.
  6. Instrumenta con OpenTelemetry para trazabilidad distribuida, empezando por los flujos de negocio más críticos.
  7. Configura alertas para los escenarios que realmente importan.
  8. Define políticas de retención y automatiza la rotación de índices.
  9. Revisa el cumplimiento RGPD de los datos que aparecen en tus logs.
  10. Documenta todo para que cualquier persona del equipo sepa cómo consultar los logs y qué hacer cuando salta una alerta.

Conclusión

Montar un sistema de logging centralizado y trazabilidad distribuida no es algo que debas dejar para cuando los problemas en producción ya se te hayan ido de las manos. Es una decisión arquitectónica que conviene tomar desde las primeras fases del proyecto y que irás refinando a medida que la aplicación crezca.

La combinación de logging estructurado, correlation IDs, un stack de centralización sólido y trazabilidad distribuida con OpenTelemetry te da la visibilidad que necesitas para operar tu aplicación con confianza. No se trata de acumular datos por acumular, sino de tener los datos correctos, bien organizados y accesibles justo cuando los necesitas.

Si necesitas ayuda para diseñar la estrategia de observabilidad de tu aplicación web a medida, Contacta con Tangram Consulting y te ayudaremos a montar un sistema de logging y trazabilidad que encaje con tu arquitectura y tus necesidades reales.

Contacta con nosotros
Fila 1