12. XI. Logs
Trata los logs como flujos de eventos.
Logs son un flujo, no un archivo
Un log no es un archivo estático que se lee una vez terminado: es la transmisión continua de eventos ordenados en el tiempo, capturados de la salida de todos los procesos en ejecución, mientras la aplicación funciona.
Responsabilidad de la aplicación: solo escribir a stdout
Una aplicación twelve-factor nunca gestiona ni enruta sus propios archivos de log. No abre archivos de log, no rota logs, no decide dónde se archivan. Su única responsabilidad es escribir cada evento, sin buffering, a stdout (salida estándar).
flowchart LR
subgraph App["Proceso de la app"]
Log["Escribe eventos a stdout"]
end
App --> Dev["Terminal del developer<br/>(desarrollo)"]
App --> Runtime["Entorno de ejecución<br/>(staging/producción)"]
Runtime --> Tools["Logplex, Fluentd,<br/>Splunk, Hadoop/Hive"]
En desarrollo: la terminal es suficiente
Durante el desarrollo local, el developer observa este flujo directamente en su terminal para entender el comportamiento de la app en tiempo real.
En producción: el entorno de ejecución captura y enruta
En staging y producción, es el entorno de ejecución (el orquestador, la plataforma cloud, el sistema de contenedores) el que captura las transmisiones de stdout de todos los procesos y las redirige a uno o más destinos finales para revisión y archivado. La aplicación no configura ni conoce esos destinos — esa es una preocupación de infraestructura, separada deliberadamente de la lógica de negocio.
Herramientas del ecosistema
Sistemas como Logplex (Heroku) y Fluentd capturan y centralizan estos flujos. Plataformas de análisis como Splunk o Hadoop/Hive permiten después:
- Buscar eventos históricos por texto o campos estructurados.
- Graficar tendencias a lo largo del tiempo (tasa de errores, latencia).
- Configurar alertas automáticas cuando un valor cruza un umbral definido.
Por qué separar esta responsabilidad
Si la app decidiera por sí misma cómo y dónde archivar sus logs, cada cambio de infraestructura (mover de un proveedor de logging a otro, cambiar de formato de almacenamiento) exigiría tocar código de la aplicación. Al delegar el ruteo al entorno de ejecución, la app se mantiene simple y la infraestructura puede evolucionar de forma independiente.
Checklist del factor XI
- La aplicación escribe todos sus eventos a
stdout, sin excepciones. - No hay código en la app que abra, rote o archive sus propios archivos de log.
- El enrutamiento y almacenamiento de logs es responsabilidad exclusiva del entorno de ejecución/infraestructura.
- Existe una herramienta centralizada (Fluentd, Logplex, un stack de observabilidad) que agrega los logs de todos los procesos.
El último factor del manifiesto cubre las tareas que se ejecutan fuera del flujo normal de la app: la administración de procesos.