Logrotate es una utilidad de sistema que administra la compresión y rotación de archivos de logs en sistemas Linux. Si los logs no se rotan, comprimen y depuran de manera periódica, eventualmente pueden consumir todo el espacio en disco disponible en el sistema. Logrotate viene instalado por defecto en Ubuntu 16.04 y está configurado para manejar la rotación de logs necesarios para todos los paquetes, incluyendo rsyslog, el procesador de logs predeterminado del sistema. En este artículo vamos a inspeccionar la configuración predeterminada de Logrotate, además de configurar la rotación de logs para una aplicación personalizada.

Configuración del entorno

Para poder seguir este tutorial deberás contar con un servidor Ubuntu Linux 16.04 y contar con un usuario que tenga permisos de sudo diferente al usuario root.

Si no sabes como crear este usuario, puedes revisar la lección sobre configuración de usuarios y control de acceso del curso de administración de servidores.

Logrotate viene instalado por defecto en la mayoría de las distribuciones de Linux pero su configuración predeterminada puede variar según la distribución que estés utilizando. Sin embargo, la mayoría de las especificaciones mencionadas en este artículo también aplican para otras distribuciones siempre y cuando la versión de Logrotate sea la misma que la mencionada posteriormente.

Verificar versión de Logrotate

Si te encuentras trabajando con un servidor diferente a Ubuntu, primero deberás verificar que Logrotate esté instalado en tu sistema ejecutando el siguiente comando:

logrotate --version

Esto deberá retornar un mensaje como el siguiente:

# Output

logrotate 3.8.7

Si Logrotate no está instalado recibirás un error por lo que deberás instalarlo con tu administrador de paquetes antes de continuar con este tutorial.

Si Logrotate está instalado pero la versión es significativamente diferente a la mostrada, puede que experimentes algunos problemas con las configuraciones que veremos en este tutorial. Puede revisar la documentación de Logrotate de tu versión instalada utilizando el siguiente comando:

man logrotate

A continuación veremos la estructura de la configuración predeterminada de Logrotate en Ubuntu 16.04.

Explorar la configuración de Logrotate

La información de la configuración de Logrotate en Ubuntu puede encontrarse en dos lugares diferentes:

  • /etc/logrotate.conf: Este archivo contiene algunas configuraciones predeterminadas y configura la rotación para algunos logs que no son propiedad de ningún paquete del sistema. Ademas utiliza una sentencia include para obtener la configuración de cualquier archivo que se encuentre en el directorio /etc/logrotate.d.
  • /etc/logrotate.d/: Aquí se van a colocar las configuraciones de Logrotate para cualquier paquete que instales en tu servidor que requiera de ayuda para rotar sus logs. En una instalación estándar deberías tener estos archivos aquí para sistemas básicos como apt, dpkg, rsyslog y más.

Veamos el contenido del archivo de configuración logrotate.conf con el siguiente comando:

cat /etc/logrotate.conf

Este comando debería retornar lo siguiente:

# Output

weekly
su root syslog
rotate 4
create
include /etc/logrotate.d

/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

Por defecto, logrotate.conf va a configurar la rotación de logs de manera semanal (weekly), con archivos de logs que sean propiedad del usuario root y del grupo syslog (su root syslog), manteniendo 4 archivos de logs (rotate 4) y creando un nuevo archivo de log después de que el actual sea rotado (create), luego tomará todos los archivos de /etc/logrotate.d/ y por último va a crear la rotación de logs para 2 archivos más /var/log/wtmp y /var/log/btmp.

Veamos los archivos de configuración de Logrotate para los paquetes en /etc/logrotate.d. En este caso, vamos a mostrar en pantalla el archivo de configuración para el paquete de la utilería apt:

cat /etc/logrotate.d/apt

Este comando debería retornar lo siguiente:

# Output

/var/log/apt/term.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

/var/log/apt/history.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

Este archivo contiene bloques de configuración para dos archivos de logs diferentes, en el directorio /var/log/apt/: term.log y history.log. Ambos tienen las mismas opciones. Cualquier opción no indicada en este archivo va a heredar los valores predeterminados en /etc/logrotate.conf. Las opciones indicadas para los logs de apt son las siguientes:

  • rotate 12: mantiene 12 archivos de logs de antigüedad.
  • monthly: rotar una vez al mes.
  • compress: comprimir los archivos que se hayan rotado. Esto utiliza gzip por defecto y los archivos resultantes tendrán la terminación .gz. El comando de compresión puede ser modificado utilizando la opción compresscmd.
  • missingok: no mostrar mensajes de error si el log en cuestión no existe.
  • notifempty: no hacer la rotación de logs si el archivo está vacío.

Existen muchas más opciones de configuración disponibles, las cuales podrás visualizar revisando la documentación de Logrotate con el comando man logrotate.

Ahora vamos a configurar la rotación para una aplicación.

Crear un archivo de configuración

Para administrar archivos de logs para las aplicaciones diferentes a los paquetes preinstalados y preconfigurados tenemos dos opciones:

  1. Crear un nuevo archivo de configuración de Logrotate y colocarlo en /etc/logrotate.d/. Esto se ejecutará diariamente como el usuario root junto con todas las demás tareas de Logrotate estándar.
  2. Crear un nuevo archivo de configuración y ejecutarlo fuera de la configuración de Logrotate predeterminada. Esto es solamente necesario si se desea ejecutar Logrotate con un usuario diferente a root, o si deseas hacer la rotación de logs de manera más frecuente, por ejemplo, rotar los logs cada hora.

Veamos un ejemplo de ambas opciones:

Agregar una configuración en /etc/logrotate.d/

Para este ejemplo vamos a crear la configuración necesaria para rotar los logs de un servidor web ficticio que pone los archivos access.log y error.log en el directorio /var/log/example-app/. Este servidor es ejecutado como el usuario y grupo www-data.

A continuación podremos ver un ejemplo de la configuración para estos logs:

/var/log/example-app/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        systemctl reload example-app
    endscript
}

Algunas de las directivas nuevas hasta este momento son las siguientes:

  • create 0640 www-data www-data: esta directiva va a crear los archivos de logs después de la rotación con los permisos especificados (0640), propietario (www-data) y grupo (www-data).
  • sharedscripts: con esta directiva podemos indicar que los scripts añadidos se ejecutarán solamente una vez por ejecución y no una vez por archivo. Ya que esta aplicación de ejemplo tiene dos logs, los scripts que vamos a agregar a continuación se ejecutarán solamente una vez por rotación, y no una vez para cada archivo de log. En caso de no indicar esta directiva, los scripts indicados en postrotate se ejecutarían dos veces para este ejemplo.
  • postrotate y endscript: este es un bloque que contiene todos los scripts que deseamos ejecutar una vez que se finalice la rotación de los logs. En este ejemplo vamos a reiniciar la configuración de example-app después de que se hayan rotado los logs.

Una vez que hayamos finalizado de editar el archivo de configuración tendremos que guardarlo en /etc/logrotate.d. Es posible probar la configuración con el siguiente comando:

sudo logrotate /etc/logrotate.conf --debug

Esto hará una llamada a logrotate, apuntando a la configuración estándar y activará el modo debug. También se mostrará información en pantalla correspondiente a los archivos que Logrotate estará manejando y qué habría hecho con ellos.

Recuerda que Logrotate se ejecuta una vez al día para los archivos que se encuentran en /etc/logrotate.d/.

Crear una configuración independiente de Logrotate

Como lo mencionamos anteriormente, esta es la configuración que debemos hacer para aplicaciones que no se están ejecutando como root, o que requieren de rotaciones más frecuentes, lo cual lo hace perfecto para poder rotar archivos de logs para aplicaciones de Laravel.

En este ejemplo nuestra aplicación se está ejecutando con el usuario styde y está generando logs en el directorio /home/styde/laravel/storage/logs/. Vamos a crear una configuración para poder rotar los logs de nuestra aplicación:

nano /home/styde/logrotate.conf

Dentro de este archivo vamos a poner lo siguiente:

/home/styde/laravel/storage/logs/* {
    hourly
    missingok
    rotate 24
    compress
    create
}

Con este ejemplo estaremos rotando los logs cada hora y estaremos almacenando 24 archivos de logs, los cuales estarán comprimidos y por último se creará un nuevo archivo de log para remplazar el que ha sido rotado. Después debemos guardar los cambios y probar que esté funcionando.

Dado que nuestra aplicación está ejecutándose con el usuario styde no necesitamos de sudo, pero sí necesitaremos especificar un archivo de estado (state). Este archivo registra todo lo que Logrotate hizo durante la última vez que se ejecutó así que debemos indicarlo al momento de ejecutar la rotación.

Vamos a ejecutar Logrotate para que se cree este archivo de estado por nosotros, siendo explícitos sobre en donde está nuestro archivo de configuración:

logrotate /home/styde/logrotate.conf --state /home/styde/logrotate-state --verbose

Y vamos a obtener un mensaje como el siguiente:

# Output
reading config file /home/styde/logrotate.conf

Handling 1 logs

rotating pattern: /home/styde/laravel/storage/logs/*.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/styde/laravel/storage/logs/access.log
  log does not need rotating

La opción --verbose va a mostrar en pantalla información detallada de lo que está haciendo Logrotate. En este caso parece no haber hecho nada ya que es la primera vez que Logrotate puede ver nuestro archivo de log.

Si revisamos el archivo de estado podremos ver algo de información al respecto:

cat /home/styde/logrotate-state

Por último debemos crear una tarea para que esto se ejecute cada hora y podemos hacerlo con el comando crontab -e. Este comando nos abrirá la configuración de tareas programadas para nuestro usuario styde, así que debemos poner algo como lo siguiente:

15 * * * * /usr/sbin/logrotate /home/styde/logrotate.conf --state /home/styde/logrotate-state

Con esto lograremos que nuestros logs se ejecuten cada hora en el minuto 15. Indicamos la ruta completa de Logrotate /usr/sbin/logrotate ya que hacer esto es una buena práctica en las tareas programadas.

Si te ha gustado este post no dejes de compartirlo en tus redes. También puedes unirte a nuestro listado de emails y seguirnos en Twitter para mantenerte al día:

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.