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 sentenciainclude
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 comoapt
,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 utilizagzip
por defecto y los archivos resultantes tendrán la terminación.gz
. El comando de compresión puede ser modificado utilizando la opcióncompresscmd
.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:
- Crear un nuevo archivo de configuración de Logrotate y colocarlo en
/etc/logrotate.d/
. Esto se ejecutará diariamente como el usuarioroot
junto con todas las demás tareas de Logrotate estándar. - 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 enpostrotate
se ejecutarían dos veces para este ejemplo.postrotate
yendscript
: 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 deexample-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:
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.