Mantenimiento de LOGs con LOGROTATE

En Linux tenemos una utilidad llamada «logrotate» que es muy potente para ayudarnos a que los filesystems no se llenen a causa de los logs que van almacenando las aplicaciones.

Pongamos por caso que una aplicación va guardando sus logs en /test, a modo de ejemplo, Y estos logs nunca se eliminan. Llegará un momento en que el filesystem se llene y no se puedan guardar más logs, causando un problema de pérdida de información o funcionamiento de la aplicación.

Gracias a logrotate podemos automatizar el mantenimiento de los logs.

¿Cómo funciona logrotate?

Por defecto, la configuración de los logs del sistema operativo se almacena en /etc/logrotate.d/, en donde encontraremos una serie de políticas de rotación de logs para diferentes filesystems del sistema operativo.

IMPORTANTE: Todas las políticas que se almacenan en /etc/logrotate.d son ejecutadas por el usuario root, por lo que un usuario sin privilegios de administrador no lo debería utilizar, pues representa un grave problema de seguridad. Logrotate puede ejecutar cualquier comando del sistema operativo con privilegios de root.

Lo que puede hacer un usuario no privilegiado es llamar al comando logrotate desde el cron. Así no tendremos ningún problema de seguridad en el sistema, ya que logrotate se está ejecutando con un usuario que no es administrador del sistema.

logrotate -f mi_fichero_de_politicas_de_rotacion_de_logs

Veamos un ejemplo de logrotate en funcionamiento

Siguiendo con el ejemplo anterior del filesystem /test, he preparado una pequeña prueba para rotar los logs que allí se encuentran.

[root@localhost test]# ll |grep test
-rw-r--r--  1 root root 107372544 Jan  1  2020 test_20201101.log
-rw-r--r--  1 root root 107372544 Dec  3 15:33 test.log
[root@localhost test]# 

A continuación, un fichero de rotación de políticas de logs.

[root@localhost test]# cat /etc/logrotate.d/test 
/test/*.log
*
{
    daily
    notifempty
    rotate 1
    missingok
    copytruncate
    compress
    postrotate
	/usr/bin/find /test -name "*.gz" -mtime +30 -exec rm  {} \;
    endscript
}
[root@localhost test]# 

La explicación de las directivas que aparecen en este fichero es:

  • /test/*.log: Indica que vamos a rotar todos los fichero con extensión .log* ubicados en el filesystem /test.
  • daily: Vamos a ejecutar diariamente la política de rotación de logs.
  • notifempty: No haremos nada si el fichero a rotar está vacío.
  • rotate 1: Vamos a guardar una copia del fichero rotado.
  • missingok: Si el fichero no exite continuamos chequeando la política de logs.
  • copytruncate: Realizamos una copia de seguridad del fichero y el log actual lo vaciamos.
  • compress: Comprimimos en gzip el fichero rotado.
  • postrotate: Ejecutamos comandos del sistema operativo una vez hemos rotado el log. Si lo ejecutamos como root, podremos realizar cuaquier cualquier comando en el sistema, por eso es conveniente que logrotate no se ejecute con root. En este ejemplo, vamos a eliminar los ficheros gz con más de treinta días de antigüedad.

Seguidamente, vamos a comprobar si las políticas de rotación de logs hacen lo que queremos que hagan.

[root@localhost test]# ll |grep test
-rw-r--r--  1 root root      0 Dec  3 15:42 test_20201101.log
-rw-r--r--  1 root root      0 Dec  3 15:42 test.log
-rw-r--r--  1 root root 104228 Dec  3 15:33 test.log.1.gz
[root@localhost test]# 

Efectivamente, ha guardado el log actual y lo ha comprimido en gzip.

Logrotate es un comando extenso, así que ejecutaremos man logrotate para conocer todas sus posibilidades.

Espero que este tutorial te haya servidor para comprender su funcionamiento.

Error «has insecure permissions»

Cuando el logrotate devuelve el error «has insecure permissions» y no rota los logs, se debe a que el directorio donde están los logs tiene unos permisos demasiado amplios, por ejemplo 777.

Tenemos dos soluciones para solventar este problema:

  • Modificamos los permisos del directorio padre para que sean más seguros, por ejemplo, 744. Si no sabes cómo hacerlo, echa un vistazo al tutorial de chmod.
  • Añadimos la directiva «su usuario grupo» dentro del fichero de rotación de logs. Por ejemplo:
[root@localhost test]# cat /etc/logrotate.d/test 
/test/*.log
*
{
    su test users
    daily
    Resto de directivas...
}
[root@localhost test]# 
COMPÁRTEME

Deja un comentario