Saltar al contenido

Hace unos años, con los servicios en estilo monolito, era “sencillo” seguir las trazas generadas por una aplicación con el fin de hacer debug y depurar, pero hoy en dia en el que las arquitecturas son más complejas y distribuidas necesitamos algo más que grep y awk, para bucear en los ficheros de logs.

Para ello han nacido las herramientas de centralización y tratamiento de logs como SplunkELK Graylog. Estas herramientas recopilan (normalmente mediante un agente que envia las trazas a un servidor) los logs de cada aplicación, independientemente de la maquina donde se generen, los tratan para normalizarlos y separar en atributos/etiquetas cada campo y también nos permiten hacer un tratamiento analítico de estos datos permitiendo crear gráficas, disparar alarmas o trabajar en la detección de anomalías.
 











 

Un pequeño inconveniente de estas herramientas es que para cada aplicación y para cada maquina es necesario desplegar un agente que haga de “forwarder” hacia el servidor central donde serán almacenadas, esto requiere una monitorización del proceso y una labor adicional de despliegue y gestión de la infraestructura pero ¿Y si fuese posible automatizarlo?

Docker viene a nuestro rescate. En cada engine es posible definir a nivel global que todos los contenedores que corran sobre él tengan un sistema de logs común. De esta forma podemos hacer que se vuelquen usando syslog o en formato JSON o usar alguno de los driver para los centralizadores de log más comunes.

¿Cómo se hace esto?

En realidad consiste en dos pasos:

1. Configurar docker engine para que los logs los envíe a un servidor centralizado (opción –logdriver):

Por ejemplo enviaremos los logs a un servidor graylog que escuche en el puerto UDP/12201 y con IP 192.168.1.100:

1    docker daemon --log-driver=gelf --log-opt=gelf-address=udp://192.168.1.100:12201

2. Haciendo que los driver de la aplicación vuelquen los logs a stderr y stdout

Por ejemplo enviaremos los logs de nginx haciendo un link en el dockerfile de esta manera:

RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log​

De esta forma todos los contenedores que se levanten en este nodo (maquina) enviaran el stdout y stderr al servidor de graylog. ¡De forma automatica e independientemente de que haya 100 o 1000 contenedores corriendo! Docker engine añadirá metadatos como el nombre del contenedor, la fecha de generación de la traza o el nodo en que ha ocurrido así como cualquier tag o label que hayamos configurado en el engine o en el contenedor.

Para nota: Cuando el flujo es complejo y pasa por muchas maquinas/aplicaciones es muy complejo de seguir ¿Que tal si creamos un ID único que nos sirva para correlar e identificar la transacción durante todo su ciclo de vida?

Si os interesa el tema podéis visitar el articulo de rancherOS donde muestran como crear un entorno basado en ELK lista para producción.

En próximas entregas hablaremos de como monitorizar la infraestructura en docker y como usar influxdb o prometheuspara detectar anomalías con los datos recogidos.

Otros artículos destacados