Logs en Docker

Este es uno de los capítulos del tutorial Docker. Introducción y primeros pasos. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

La mejor manera de saber lo que está sucediendo en cualquier proceso en Linux es revisando sus logs. Y por supuesto los contenedores están incluidos en la afirmación anterior. Si las cosas no funcionan como esperabas, si tu contenedor no termina de arrancar, si no está generando el resultado correcto, y no sabes a que es debido, la mejor manera de resolverlo es mirando sus logs. En este sentido, no solo tienes que mirar los logs del propio contenedor, sino que además en ocasiones, debes mirar también los logs del propio docker. De esta forma podrás averiguar que es lo que sucede. Así, en este capítulo del tutorial va a tratar sobre logs en docker.

Pero, ¿donde están los logs en docker?¿Como puedo revisar los logs en docker en caso de que se haya producido un error o que quiera monitorizarlos?

Logs en Docker

Logs en docker

Como te decía en la introducción, hay que distinguir dos logs cuando tratamos con logs en Docker. Por un lado los logs de los contenedores y por el otro lado los logs del propio servicio docker.

El log del servicio Docker

Depende de la distribución que estés utilizando los logs en Docker, en referencia al propio servicio, lo puedes encontrar en diferentes sitios,

  • Para el caso de Debian lo encontrarás en /var/log/daemon.log
  • Si utilizas Ubuntu, Linux Mint, etc, tienes que utilizar journalctl -u docker.service
  • En el caso de RHEL se encuentra en /var/log/messages

En cualquier caso, te recomiendo el uso de dos potentes herramientas como son less y grep. Así te recomiendo la lectura del artículo Menos es mas con less… Visualización de archivos pesados https://www.atareao.es › como › menos-es-mas-con-less para el caso de uso de less. Mientras que para el uso de grep, te recomiendo el capítulo Filtros: awk, grep, sed y cut – El atareao https://www.atareao.es › tutorial › terminal › filtros-awk… del tutorial sobre el terminal.

Así para inspeccionar con mas comodidad en el caso de Ubuntu, tienes que ejecutar,

journalctl -u docker.service | less

Los logs en los contenedores

Dependiendo de la configuración, es posible revisar los logs de los contenedores, utilizando el comando docker log, o bien revisando un sistema externo como puede ser syslog. Que sea una opción u otra va a depender de como lo tengas configurado.

En el caso de que estés utilizando un sistema de logs externo, es necesario que tengas instalado un controlador de logs.

Sin embargo, existen diferentes particularidades dependiendo de la imagen que estés utilizando. Por ejemplo, el servidor web Nginx utiliza /var/log/nginx/error.log y /var/log/nginx/access.log. Sin embargo, en el caso de la imagen de Nginx los logs los puedes consultar directamente utilizando el comando de docker preparado para ello. Pruébalo. Levanta un contenedor docker de Nginx, visita localhost e inspecciona el log. Para ello, ejecuta las siguientes instrucciones,

docker run -d --name nginx1 -p 80:80 nginx
docker logs nginx1

¿como inspeccionar logs en Docker?

Para inspeccionar logs en docker tienes que utilizar la herramienta docker logs con el contenedor que quieras inspeccionar. Para indicar el contenedor a inspeccionar, puedes utilizar o bien el identificador del contenedor, o bien el nombre del contenedor. De ahí lo interesante de poner nombre a los contenedores.

Por supuesto, Docker te da una serie de opciones para mejorar la usabilidad de esta herramienta como son,

  • --details te muestra información adicional
  • -f ó --follow sigue el log. El funcionamiento es exactamente igual que el de tail -f, y que tanta horas de diversión me ha proporcionado. Realmente, seguir un log es como estar en Matrix.
  • --since te muestra el log desde una fecha determinada, ya sea una fecha absoluta como 2019-10-08T05:40:01. O de forma relativa con 40m para indicar que quieres ver el log desde hace hace 40 minutos (utiliza h para horas y s para segundos).
  • --tail con esta opción le indicas el número de líneas que quieres que te muestre.
  • -t te muestra el timestamp
  • --until, es exactamente igual que la opción --since, pero en lugar de desde es hasta.

Así con un poquito de habilidad, puedes consultar el log en un perído concreto de tiempo. Por ejemplo, entre tres y dos horas,

docker logs --since 3h --until 2h test01

Otra opción interesante opción que tienes, y que ya he comentado anteriormente, es la de leer las últimas líneas del log y sobre todo, de seguir lo que va sucediendo en el propio log del contenedor. Así, por ejemplo,

docker logs --tail 100 -f test01

Logs en Docker con logging drivers

Pero, ¿que sucede si quieres exportar tus logs en Docker para utilizarlos o analizarlos posteriormente?.¿Que pasa si quieres utilizar otros herramientas como Syslog o Logstash?. Para estos casos puedes utilizar los logging drivers.

Pero ¿que es eso de logging drivers? Pues precisamente es lo que andas buscando. Se trata de una serie de complementos que puedes activar o instalar para exportar los logs en Docker a una herramienta externa como las mencionadas anteriormente, Syslog, Logstash, etc.

Por defecto, en general, utilizas el controlador de logs en docker denominado json-file. Para comprobar que este es tu controlador, ejecuta la siguiente instrucción,

$ docker info | grep Logging
Logging Driver: json-file

En el caso de que quieras cambiar el controlador de Logging utilizado, para todos los docker, tan solo tienes que editar el archivo /etc/docker/daemon.log. Si no existe, simplemente lo creas. Si por ejemplo, quieres utilizar syslog, el contenido de este archivo será el siguiente,

{
"log-driver":"syslog"
}

En este sentido, indicarte que en mi caso, una vez modificado y reiniciado docker, seguía indicándome el mismo controlador de Log, como si efectivamente no lo hubiera cambiado.

Sin embargo, si solo quieres utilizar ese controlador para un único contenedor, lo puedes especificar directamente como una opción al levantar el contenedor. Así, por ejemplo si ese contenedor que llevamos a medias de Nginx, lo quisieras utilizar con journald, tan solo tienes que ejecutar,

docker run -d --name nginx1 --log-driver journald --network host nignx

He añadido la opción --network host para poder utilizar los puertos del anfitrión. Así puedes ver en tiempo real las llamadas que vas realizando.

Una vez iniciado, puedes ver lo que sucede en ese contenedor en tiempo real, utilizando la siguiente instrucción,

journalctl -f CONTAINER_NAME=nginx1

Así cada vez que vayas a localhost en tu navegador preferido, que espero, sinceramente que sea el todopoderosa Firefox, verás una nueva entrada en journalctl.

De la misma forma, lo puedes hacer utilizando Syslog. Así, para levantar un Nginx con un controlador de log apuntando a Syslog, la instrucción sería,

docker run -d --name nginx1 --log-driver journald --network host nignx

En este caso, en lugar de utilizar journalctl para inspeccionar los logs, tienes que revisar /var/log/syslog. De la misma manera que antes, si quieres seguir en tiempo real lo que se produce en el log, simplemente ejecuta,

tail -f /var/log/syslog

Logs en Docker Compose

¿Y si quiero ver los Logs en Docker Compose? Pues, tan sencillo como lo que acabas de ver con docker. Ejecuta,

  • docker-compose logs para ver los logs
  • docker compose logs <service> para ver el log de uno de los servicios

Por supuesto puedes utilizar las opciones -f para seguir el log, y --tail para mostrar las n últimas líneas.

Conclusión

Como ves esto de los logs en Docker es realmente sencillo, y puede ser una potente herramienta para saber lo que está sucediendo en tu contenedor. Para comprobar que todo funciona correctamente. Y por supuesto, en el caso de que haya algún problema, para detectar cual es, y como solucionarlo.


Más información,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *