Log: Vaciando registros en GNU/Linux

Publicado por Diego Córdoba en

En este artículo aprenderemos cómo limpiar algunos registros, o log, de actividad del sistema operativo GNU/Linux y de los servicios/daemons que lo integran.

Más de una vez me he quedado sin espacio en el disco rígido de mi instalación, y eso es principalmente porque tengo tendencia a dejarle poco espacio a la partición /, una costumbre difícil de remover 😛

Una de las actividades que en general (y más en sistemas que uso como servidor) generan más espacio de almacenamiento son los registros o logs de actividad.

Los servicios en general escriben sus registros en archivos de texto. Incluso el sistema operativo también lo hace si el gestor de servicios y de inicio es SysV Init. En el caso de los sistemas systemd los registros pasan a ser archivos binarios que no pueden analizarse directamente, y se requiere el uso del set de utilidades de systemd.

Vamos a ver brevemente cómo podemos ver el tamaño que consumen en disco los logs y registros tanto en SysV init como en systemd, y aprenderemos también a vaciar estos archivos si necesitamos espacio, o simplemente porque no queremos guardar registros de hace mucho tiempo.

Log en SysV Init

log sysvinit sys v init registro

Los archivos de log en sistemas SysV init se encuentran en el directorio /var/log. De hecho, en prácticamente cualquier sistema GNU/Linux los logs se encuentran en ese directorio. Es por esa razón que muchas veces se suele, más que nada en sistemas servidores, destinar una partición entera para el punto de montaje /var.

Podemos ver el espacio en disco que ocupan los logs de analizando el tamaño en disco del directorio /var/log.

diego@cryptos:~$ sudo du -sh /var/log/
2.4G	/var/log/

Si suponemos que el archivo /var/log/wtmp es el que consume mucho espacio, y no nos interesa mantener su contenido, podemos limpiar su contenido con un comando similar a este: > /var/log/wtmp` de esta forma:

[root@cryptos ~]# ls -lh /var/log/wtmp
-rw-rw-r-- 1 root utmp 1.1M Jun 17  2019 /var/log/wtmp
[root@cryptos ~]# 
[root@cryptos ~]# > /var/log/wtmp       # borramos el contenido
[root@cryptos ~]# 
[root@cryptos ~]# ls -l /var/log/wtmp
-rw-rw-r-- 1 root utmp 0 Jul 28 18:34 /var/log/wtmp
[root@cryptos ~]# 

En esa captura se puede ver que el archivo, luego de ejecutar el comando de la línea 4, pasó a tener espacio nulo. Eso podríamos hacerlo con todos los archivos de log que tengan un tamaño considerable, y por supuesto, que no nos interese mantener.

El comando utilizado es equivalente a:

echo "" > /var/log/wtmp

También puede editarse el archivo y borrar su contenido, y también puede borrarse el archivo, aunque esto en realidad no lo recomiendo mucho porque, dependiendo del servicio, no estoy seguro de que los archivos de log no se re-generen solos… una buena técnica sería renombrar el archivo de log del servicio y ver si se genera un archivo nuevo en que comiencen a escribirse los logs 🙂

Log en systemd

log systemd registro

Los logs en systemd se denominan journals. Los journals no se almacenan en formato de texto plano en el disco, como sí lo hacían en SysV Init, sino que lo hacen en formato binario y pueden leerse e interpretarse mediante las utilidades de systemd, por ejemplo, journalctl.

Por cierto, en general se almacenan en /var/log/journal.

En systemd tenemos varias alternativas y variantes.

Por ejemplo, podemos vaciar los logs por temporización, eliminando todas las entradas en journal cuya antigüedad sea mayor a los 30 días:

journalctl --vacuum-time=30d

Por otro lado podemos hacerlo por tamaño. Si no queremos que los logs superen los 800 MiB de almacenamiento, podemos borrar todo el contenido excedente de esta forma. El contenido que queda es, por supuesto, el más nuevo.

journalctl --vacuum-size=800M

En el caso de que tengamos archivos de log remotos que quisiéramos incluir en esta eliminación, deberíamos agregar la opción -m o --merge para que los abarque.

Archivado y rotación en systemd

Estas dos, cabe aclarar, eliminan archivos de log o journal que se encuentran archivados. Un log se archiva durante el proceso de rotación de los logs, o rotate, cuando se congela el contenido del fichero de log, se copia en un archivo con otro nombre, y se vacía el original. Los nuevos mensajes se almacenarán en un nuevo archivo de log vacío.

Por ejemplo, si el sistema almacena los logs en el archivo /var/log/ejemplo, cuando se hace la rotación, ese archivo pasará a llamarse /var/log/ejemplo.1 (por ejemplo), y se creará un nuevo /var/log/ejemplo en blanco para seguir almacenando registros.

En este caso, el archivo /var/log/ejemplo.1 se lo considera archivado, y es posible eliminarlo usando los mecanismos vistos. Sin embargo, si el archivo /var/log/ejemplo contiene mucha información, esos datos no se van a eliminar.

Si necesitamos liberar espacio, una buena medida es forzar la rotación de logs, y luego liberar espacio por tiempo o por tamaño.

La rotación puede realizarse de esta forma en la mayoría de las distros actuales (algunas versiones anteriores de systemd no tenían presente la opción --rotate.

journalctl --rotate

Configurar journalctl

Finalmente, otra opción válida en systemd es configurar el daemon de registros para que almacene como máximo un tamaño determinado.

Para ello podemos editar el archivo /etc/systemd/journald.conf y agregar (o modificar) esta línea:

SystemMaxUse=200M

Y luego reiniciar el daemon de logs:

sudo systemctl restart systemd-journald

De esa forma no se almacenarán más de 200M en logs.

También puede limitarse el tamaño por archivo con SystemMaxFileSize, o la cantidad de archivos de log con SystemMaxFiles, entre otras.


Sin más, espero les sirva!

Cualquier alternativa, comando que suelan utilizar o, por qué no, correcciones y sugerencias, no tienen mas que escribir en la caja de comentarios! Gracias!

Les dejo unas fuentes interesantes para consultar al respecto.

Hasta la próxima!

Fuentes:

https://clouding.io/hc/es/articles/360011390920-Vaciar-logs-en-Linux
https://ma.ttias.be/clear-systemd-journal/
https://unix.stackexchange.com/questions/139513/how-to-clear-journalctl
man journalctl
man journald.conf

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador