Visualiza los logs de NGINX de tu servidor web
He pasado este último año aprendiendo a crear diferentes side-projects, por lo que he tenido que desplegar y configurar varios servidores para servir el tráfico web.
El caso es que estos servidores tienen cierto tráfico web, y me planteé el comenzar a guardar estos logs para ver qué información puedo sacar de ellos, y me encontré datos bastante interesantes que comentaré y analizaremos en el siguiente post.
Hoy me quiero centrar en cómo puedes, de forma simple, descargarte estos ficheros y procesarlos para extraer algunas métricas.
NGINX Logs
Para mí, el servidor web más simple y eficiente es NGINX. Es cierto que hay otras alternativas como caddy o traefik que aportan otras ventajas, pero al final siempre termino usando NGINX.
Puedes configurar el servidor web NGINX para que almacene los logs de tu aplicación con la siguiente línea:
server {
...
access_log /var/log/nginx/access.log;
...
}
Por defecto el formato con el que se registran los logs de NGINX es combined, lo que significa que tienen la siguiente estructura:
$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"
Este formato se puede modificar, a mi por ejemplo me gusta añadir el
host
si sirves múltiples webs desde un mismo servidor. Incluso se puede modificar para que sea un JSON.
Para probarlo, puedes levantarte un contenedor de docker con el siguiente comando:
docker run --rm -p 8080:80 nginx
Esto te mostrará los logs en la propia terminal y si entras en el navegador en http://localhost:8080
o bien ejecutas curl
, podrás ver un log como el siguiente:
192.168.1.1 - - [03/Feb/2024:17:22:36 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla..." "-"
Logrotate
Si cualquier aplicación escribiese en un único fichero, con el paso del tiempo (o con un gran volumen de peticiones), este pasaría a tener un tamaño demasiado grande y sería poco manejable.
Es por ello que cuando instalas NGINX se suele configurar la herramienta logrotate
para que rote
el fichero access.log
. De esta forma en el servidor te encontrarás los ficheros: access.log,
access.log.1, access.log.2, access.log.3.gz ... Esto nos será útil cuando queramos descargarnos los
ficheros de log.
Puedes ver la configuración en /etc/logrotate.d/nginx
.
Descargando los logs mediante ssh/scp
El siguiente paso es utilizar ssh/scp
para descargarnos estos ficheros.
Podemos pedirle a ChatGPT-4 y que nos genere un script simple, aunque he tenido que ajustar algunos puntos que no eran correctos.
Puedes create un script que contenga el siguiente comando para bajarte algunos cuantos logs de tu
servidor, y descomprimirlos usando el comando gunzip
:
scp -i /path/to/your/ssh-key user@host:/var/log/nginx/access.log.<file>
...
gunzip *
Procesando los logs con Go
Por último he creado un programa utilizando Go, ya que es un lenguaje que conozco bastante, es eficiente y me permite procesar estos ficheros bastante rápido.
De cada fichero de log simplemente tenemos que extraer el modelo de datos, que lo podemos definir como el siguiente ejemplo:
struct Hit {
date: Date;
ip: string;
status: string;
size: int;
path: string;
host: string;
...
}
Una vez analizamos los múltiples ficheros (en mi caso tengo dos meses de datos), genero algún tipo de output con los datos para que podamos analizarlo. He elegido SQLite, ya que me parece un motor muy interesante y me permite lanzar todo tipo de queries para explorar estos datos en mayor profundidad.
Visualización con Metabase
Para visualizar estos datos rápidamente he probado a realizar algunas gráficas conectado el SQLite anterior a una herramienta de visualización como lo es Metabase. De esta forma puedo generar una gráfica como la siguiente, modificando los filtros y agrupaciones que necesito para estudiar el comportamiento de mi página:
Puedes utilizar el siguiente comando de docker si lo necesitas:
docker run -d -p 3000:3000 -v /path/to/your/sqlite/file:/file.sqlite --name metabase metabase/metabase
Simplemente accede desde tu navegador a http://localhost:3000 y configura el entorno de metabase. Luego selecciona crear una pregunta y configura los parámetros que quieras.
Para el ejemplo, he decidido graficar el número hits agrupado por día y por host, filtrando únicamente los hosts de este blog y quitando las peticiones que vienen del user-agent que utilizo como monitor de uptime:
Siguientes pasos
Esta es una primera aproximación para descargarme los logs de mi servidor y poder explorarlos con calma. Es cierto que es un mecanismo simple y rudimentario, sin "sobre-ingeniería", pero que me permite en primera instancia explorar estos datos.
El proceso aún tiene muchos puntos por mejorar, que iré realizando en los siguientes posts y vídeos. Además me gustaría analizar el contenido de estos en mayor profundidad.
Si te ha parecido interesante, me gustaría que dejes un comentario en el vídeo de youtube o bien a través de twitter y te suscribas a la newsletter del blog.
Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.