Borrar logs con Systemd / journalctl

Me dejo por aquí unas notas de como borrar logs cuando usamos systemd / journalctl. Empieza a ser cada vez más abundante y creo que a más gente le puede resultar de utilidad.

Habitualmente estábamos acostumbrados a tener unos loggers de sistema que corrian como un demonio. Algunos populares eran syslog-ng o rsyslog. En los últimos años, con la popularización de systemd, nos encontramos con que hay una pieza nueva en el puzzle llamada systemd-journald.

Ubicación de los logs con systemd

Los logs que se guardan con systemd-journald pueden encontrarse habitualmente en /run/log/journal/ o en /var/log/journal/. Si el lugar de almacenamiento es el primero, los logs están configurados para no tener persistencia y se perderán tras un reinicio.

Tamaño de los logs con journald

Para saber cuanto espacio ocupan los logs de journald, podemos usar el comando journalctl –disk-usage. Si queremos tener una cifra exacta que incluya todos los logs del sistema, debemos lanzarlo con privilegios de usuario administrativo (root o pertenecientes al grupo adm o systemd-journal)

[javi@casa.casa:~]$ journalctl --disk-usage
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
Archived and active journals take up 352.0M in the file system.
[javi@casa.casa:~]$ sudo journalctl --disk-usage
Archived and active journals take up 3.9G in the file system.

Borrar logs con systemd y journalctl

journalctl nos da bastante flexibilidad a la hora de eliminar logs, ya que podemos pedirle que borre en función del tamaño, de su antiguedad, o dejando solo un número de archivos.

Comencemos borrando indicándole el tamaño máximo que queremos dejar entre todos los logs que maneja systemd-journald.

[javi@casa.casa:~]$ sudo journalctl --vacuum-size=2500M
Vacuuming done, freed 0B of archived journals from /var/log/journal.
[... muchas lineas ...]
Vacuuming done, freed 1.5G of archived journals from /var/log/journal/ID-DEL-EQUIPO.
Vacuuming done, freed 0B of archived journals from /run/log/journal.

Comprobemos.

[javi@casa.casa:~]$ sudo journalctl --disk-usage
Archived and active journals take up 2.4G in the file system.

El comando anterior acepta unidades como K, M, G, etc.

También podemos decir que queremos borrar todos los logs más antiguos de una fecha. Para ello usaremos journalctl –vacuum-time=XX. En este caso, se aceptan unidades como «s» para segundo, «m» para minutos, «h» para horas, «w» para semanas o «M» para meses.

[javi@casa.casa:~]$ sudo journalctl --vacuum-time=0.2M
Vacuuming done, freed 0B of archived journals from /run/log/journal.
[... muchas lineas ...]
Vacuuming done, freed 1.6G of archived journals from /var/log/journal/ID-DEL-EQUIPO.
Vacuuming done, freed 0B of archived journals from /var/log/journal.

Como se puede ver, el comando acepta que le digamos cosas como 0,2 meses.

Rotar logs con journalctl

Por último, hay que saber que podemos pasar el parámetro –rotate a journalctl para que genere un rotado de los logs y no se escriba más en ellos.

Configurar un tamaño máximo de los logs de systemd-journald

Si queremos tener a raya el tamaño de los logs de journald o bien mantenerlos con un histórico de un tiempo máximo, podemos configurar el archivo /etc/systemd/journald.conf

En este archivo de configuración de journald, nos encontraremos directivas tan interesantes como:

  • SystemMaxFileSize para decir cuanto es el tamaño máximo de archivo de logs que queremos antes de que se rote.
  • MaxRetentionSec para decir la cantidad de tiempo máxima que queremos que se guarden estos logs.
  • SystemMaxFiles para decir el número máximo de archivos de logs que queremos almacenar.
  • SystemMaxUse para decir el espacio máximo que deben ocupar los logs de sistema.