Logrotate es el héroe que todo administrador de sistemas necesita. Si tus logs crecen como monstruos y amenazan con devorar tu disco duro, esta herramienta los mantiene a raya: los rota, comprime, archiva o elimina automáticamente.
En esta guía te llevaremos de la mano por el mundo de Logrotate, con ejemplos prácticos para servicios como NGINX, Netdata, MariaDB y Apache, además de tips para Linux y FreeBSD. ¡Prepárate para ordenar tus logs con un toque de humor!
¿Qué es Logrotate y por qué lo necesitas?
Imagina que tu servidor lleva meses funcionando y, de repente, /var/log/
está lleno de archivos de logs de varios gigabytes. Sin Logrotate, tu disco podría colapsar, causando problemas en el sistema. Esta utilidad automatiza la rotación de logs, asegurando que tu servidor respire tranquilo y tú no tengas que limpiar a mano.
Instalación de Logrotate
Logrotate suele venir preinstalado en la mayoría de las distribuciones Linux modernas. Para verificarlo, ejecuta:
logrotate --version
Si no está instalado, aquí tienes los comandos para cada sistema:
Ubuntu/Debian:
sudo apt update && sudo apt install logrotate
CentOS/RHEL:
sudo yum install logrotate
Fedora:
sudo dnf install logrotate
Arch Linux:
sudo pacman -S logrotate
FreeBSD:
sudo pkg install logrotate
Nota para FreeBSD: Las configuraciones suelen estar en /usr/local/etc/logrotate.d/
en lugar de /etc/logrotate.d/
. El resto es muy similar a Linux.
No necesitas iniciar ni reiniciar Logrotate, ya que no es un servicio, sino una utilidad que se ejecuta manualmente o vía cron.
Archivos de configuración
Logrotate organiza sus reglas en dos lugares principales:
- Configuración global:
/etc/logrotate.conf
Aquí defines las reglas generales que aplican a todos los logs (en FreeBSD, usa/usr/local/etc/logrotate.conf
). - Configuraciones específicas:
/etc/logrotate.d/
Este directorio contiene archivos individuales para cada aplicación o servicio (en FreeBSD,/usr/local/etc/logrotate.d/
).
Configuración básica de Logrotate
Un ejemplo sencillo de /etc/logrotate.conf
sería:
weekly
rotate 4
create
compress
include /etc/logrotate.d
weekly
: Rota los logs cada semana.rotate 4
: Guarda 4 copias archivadas.create
: Crea un nuevo archivo de log tras la rotación.compress
: Comprime los logs para ahorrar espacio.include /etc/logrotate.d
: Carga las configuraciones específicas del directorio.
Directivas clave de Logrotate
Antes de meternos con ejemplos, aquí tienes un mapa del tesoro con las opciones más útiles para configurar Logrotate:
Opción | ¿Qué hace? |
---|---|
rotate N | Guarda solo las últimas N copias de los logs. |
maxage N | Elimina logs más antiguos que N días. |
size xM | Rota si el archivo supera los xMB. |
daily , weekly , monthly | Rota cada día, semana o mes. |
compress | Comprime los logs rotados. |
delaycompress | Comprime solo el log anterior, evitando conflictos con el archivo en uso. |
create [permisos] [usuario] [grupo] | Crea un nuevo log con permisos y dueño específicos. |
missingok | Ignora si el log no existe, sin errores. |
notifempty | No rota si el log está vacío. |
copytruncate | Copia el log y trunca el original (útil si el servicio no lo suelta). |
sharedscripts | Ejecuta scripts prerotate o postrotate solo una vez, aunque afecte varios logs. |
postrotate | Ejecuta un script después de rotar (ej., reiniciar un servicio web). |
sudo script ... endscript | Ejecuta la rotación como un usuario/grupo específico. |
Con estas opciones, puedes personalizar Logrotate para cualquier escenario.
Ejemplos prácticos para servicios populares
Configuración para NGINX
Los logs de NGINX pueden crecer como gremlins mojados. Crea el archivo /etc/logrotate.d/nginx
:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
daily
: Rota cada día.rotate 7
: Guarda 7 copias.postrotate
: Envía una señal USR1 para que NGINX reabra los logs.
Configuración para Netdata
Netdata escribe logs en /var/log/netdata/
. Crea /etc/logrotate.d/netdata
:
/var/log/netdata/*.log {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 0640 netdata netdata
sharedscripts
postrotate
systemctl restart netdata > /dev/null 2>&1 || true
endscript
}
weekly
: Rota cada semana.postrotate
: Reinicia Netdata para usar nuevos logs.
Configuración para MariaDB
MariaDB guarda sus logs en /var/log/mysql/
. Crea /etc/logrotate.d/mysql
:
/var/log/mysql/*.log /var/log/mysql/*.err {
daily
missingok
rotate 5
compress
delaycompress
notifempty
create 640 mysql adm
sharedscripts
postrotate
test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin flush-logs > /dev/null 2>&1 || true
endscript
}
rotate 5
: Guarda 5 copias.flush-logs
: Cierra los logs actuales y abre nuevos.
Configuración para Apache
Apache (o httpd
en CentOS) genera logs de acceso y errores. Crea /etc/logrotate.d/apache
:
/var/log/apache2/*.log /var/log/httpd/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/apache2.pid ] && kill -HUP `cat /var/run/apache2.pid` || true
endscript
}
daily
: Rota diariamente.postrotate
: Envía una señal HUP para que Apache reabra los logs.- Nota: En CentOS, usa
/var/log/httpd/
y el grupo puede serapache
.
Configuración genérica para un servicio (inspirada en Logstash)
Si tienes un servicio que genera múltiples logs en un directorio, como /var/log/miservicio/
, crea /etc/logrotate.d/miservicio
:
/var/log/miservicio/*.log {
daily
size 10M
rotate 30
maxage 30
missingok
notifempty
compress
delaycompress
create 0644 root root
sharedscripts
postrotate
systemctl restart miservicio > /dev/null 2>&1 || true
endscript
}
size 10M
: Rota si el log supera 10MB.maxage 30
: Elimina logs mayores a 30 días.*
: Aplica a todos los logs en el directorio.
Ejecución de Logrotate
Logrotate puede ejecutarse manualmente o automáticamente.
Manualmente
Para probar una configuración, usa:
sudo logrotate -f /etc/logrotate.d/nginx
El flag -f
fuerza la rotación. Para depurar sin hacer cambios, usa:
sudo logrotate -d /etc/logrotate.conf
O para más detalles:
sudo logrotate -v /etc/logrotate.conf
Automáticamente
Por defecto, Logrotate se ejecuta diariamente gracias a una tarea en /etc/cron.daily/logrotate
. Esta tarea lee /etc/logrotate.conf
y todas las configs en /etc/logrotate.d/
.
Si quieres un horario personalizado, crea una regla en cron:
- Encuentra la ruta de Logrotate:
which logrotate
(Suele ser /usr/sbin/logrotate
).
- Edita el crontab:
crontab -e
- Añade, por ejemplo:
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
Esto rota los logs de NGINX a medianoche. Para todos los logs, usa /etc/logrotate.conf
.
Diagnóstico y solución de problemas
Si algo falla, usa el modo debug (-d
) para ver cómo Logrotate interpreta tus configs. Por ejemplo, si estás revisando la configuración de un servicio como NGINX:
sudo logrotate -d /etc/logrotate.d/nginx
O, si quieres ver cómo interpreta Logrotate todas tus configuraciones juntas:
sudo logrotate -d /etc/logrotate.conf
Si necesitas más pistas, el modo verbose (-v
) te dará detalles jugosos. Asegúrate de que:
- Los permisos de los logs permitan a Logrotate accederlos.
- Los scripts
postrotate
sean correctos (ej., que el servicio exista). - Los archivos de log existan o uses
missingok
.
Conclusión
Logrotate es tu mejor amigo para mantener los logs bajo control, ya sea en Linux o FreeBSD. Con las configuraciones adecuadas, puedes evitar desastres de disco lleno y mantener tu servidor en orden. Como dice el dicho: “Un log sin rotar es como un corazón sin latir: no dura mucho”.
¿Tienes algún truco o configuración épica para Logrotate? ¡Compártelo en los comentarios! Mientras tanto, ¡a rotar esos logs como campeones!
¿Qué te parece?
Es bueno conocer tu opinión. Deja un comentario.