Configuración de Logrotate: Guía Completa

Introducción

Los archivos de log son esenciales para monitorear la salud del sistema, depurar aplicaciones y mantener la seguridad, pero sin una gestión adecuada, pueden consumir rápidamente valioso espacio en disco y dificultar el análisis de logs. Logrotate es una potente utilidad que automatiza la rotación, compresión y eliminación de archivos de log, asegurando que tus logs permanezcan manejables mientras preserva datos históricos cuando sea necesario.

Logrotate maneja el ciclo de vida completo de los archivos de log rotándolos automáticamente según el tamaño o intervalos de tiempo, comprimiendo logs antiguos para ahorrar espacio y eliminando logs antiguos según políticas de retención. Esta automatización previene el agotamiento del espacio en disco, mantiene el rendimiento del sistema y asegura el cumplimiento de los requisitos de retención de datos.

En esta guía completa, exploraremos la configuración de logrotate desde conceptos básicos hasta implementaciones avanzadas. Aprenderás cómo configurar políticas de rotación para logs del sistema, logs de aplicaciones y servicios personalizados, implementar estrategias de compresión, gestionar períodos de retención y solucionar problemas comunes. Ya sea que estés gestionando un solo servidor o una flota de sistemas, dominar logrotate es esencial para mantener una infraestructura de logging saludable.

Prerrequisitos

Antes de configurar logrotate, asegúrate de tener:

  • Un servidor Linux (Ubuntu 20.04/22.04, Debian 10/11, CentOS 7/8, Rocky Linux 8/9, o similar)
  • Acceso root o sudo para modificar configuraciones del sistema
  • Comprensión básica del sistema de archivos de Linux y permisos
  • Familiaridad con ubicaciones de archivos de log (típicamente /var/log/)
  • Editor de texto (nano, vim, o vi)

Requisitos del Sistema:

  • Paquete logrotate instalado (usualmente preinstalado en la mayoría de distribuciones)
  • Suficiente espacio en disco para archivos de log temporales durante la rotación
  • Daemon cron en ejecución para rotación programada

Instalando y Verificando Logrotate

La mayoría de distribuciones Linux incluyen logrotate por defecto, pero vamos a verificar e instalar si es necesario.

Instalación

En Ubuntu/Debian:

# Verificar si logrotate está instalado
dpkg -l | grep logrotate

# Instalar si no está presente
sudo apt update
sudo apt install logrotate -y

# Verificar instalación
logrotate --version

En CentOS/Rocky Linux/AlmaLinux:

# Verificar si logrotate está instalado
rpm -qa | grep logrotate

# Instalar si no está presente
sudo yum install logrotate -y

# Verificar instalación
logrotate --version

Verificar Servicio Logrotate

# Verificar timer systemd de logrotate (si usa systemd)
systemctl list-timers | grep logrotate

# Ver trabajo cron de logrotate
cat /etc/cron.daily/logrotate

# Verificar archivo de estado de logrotate
cat /var/lib/logrotate/status
# o en sistemas más antiguos
cat /var/lib/logrotate.status

Entendiendo la Arquitectura de Logrotate

Archivo de Configuración Principal

El archivo de configuración principal es /etc/logrotate.conf:

# Ver configuración principal
sudo cat /etc/logrotate.conf

Estructura típica de logrotate.conf:

# Opciones globales
weekly
rotate 4
create
dateext
compress

# Archivos de configuración específicos de paquetes
include /etc/logrotate.d

# Logs específicos del sistema
/var/log/wtmp {
    monthly
    create 0664 root utmp
    minsize 1M
    rotate 1
}

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

Directorio de Configuración

Las configuraciones específicas de aplicaciones se almacenan en /etc/logrotate.d/:

# Listar todas las configuraciones de logrotate
ls -l /etc/logrotate.d/

# Ejemplos de configuraciones
/etc/logrotate.d/apache2
/etc/logrotate.d/nginx
/etc/logrotate.d/mysql-server
/etc/logrotate.d/rsyslog

Archivo de Estado

Logrotate rastrea el historial de rotación en un archivo de estado:

# Ver estado actual de rotación
sudo cat /var/lib/logrotate/status

# Ejemplo de salida:
# "/var/log/syslog" 2024-1-11-3:0:0
# "/var/log/auth.log" 2024-1-11-3:0:0
# "/var/log/nginx/access.log" 2024-1-10-3:0:0

Sintaxis de Configuración de Logrotate

Estructura Básica de Configuración

Un archivo de configuración de logrotate consiste en patrones de archivos de log y directivas:

# Estructura básica
/ruta/al/logfile {
    # Directivas de rotación
    directiva1
    directiva2 valor

    # Scripts
    prerotate
        # comandos antes de la rotación
    endscript

    postrotate
        # comandos después de la rotación
    endscript
}

Directivas Comunes

Frecuencia de Rotación:

daily           # Rotar logs diariamente
weekly          # Rotar logs semanalmente (domingos por defecto)
monthly         # Rotar logs mensualmente (primer día del mes)
yearly          # Rotar logs anualmente (1 de enero)

Condiciones de Rotación:

size 100M       # Rotar cuando el archivo alcance 100MB
minsize 10M     # Rotar solo si el archivo es al menos 10MB
maxsize 500M    # Forzar rotación si el archivo excede 500MB
rotate 7        # Mantener 7 logs rotados
maxage 30       # Eliminar logs más antiguos de 30 días

Manejo de Archivos:

compress        # Comprimir logs rotados con gzip
nocompress      # No comprimir logs
delaycompress   # Comprimir en la próxima rotación (mantener uno sin comprimir)
compresscmd gzip        # Especificar comando de compresión
compressext .gz         # Especificar extensión de compresión
compressoptions -9      # Compresión máxima

create 0640 user group  # Crear nuevo log con permisos
nocreate                # No crear nuevo archivo de log
copy                    # Copiar log en lugar de mover
copytruncate            # Copiar y luego truncar log original

Archivos Faltantes:

missingok       # No dar error si el archivo de log falta
notifempty      # No rotar si el log está vacío
ifempty         # Rotar incluso si el log está vacío

Manejo de Logs Antiguos:

dateext         # Agregar extensión de fecha (ej., .20240111)
dateformat -%Y%m%d      # Formato de fecha personalizado
extension .log  # Extensión a preservar
olddir /ruta/a/antiguos     # Mover logs antiguos a directorio
noolddir                # Mantener logs antiguos en el mismo directorio

Envío por Correo:

mail [email protected]  # Enviar log por correo antes de eliminar
nomail                  # No enviar logs por correo
mailfirst               # Enviar el log más nuevo
maillast                # Enviar el log más antiguo (predeterminado)

Logs Compartidos:

sharedscripts   # Ejecutar scripts una vez para todos los logs coincidentes
nosharedscripts # Ejecutar scripts para cada log por separado

Configuraciones Básicas de Logrotate

Rotación Diaria Simple

# Crear configuración: /etc/logrotate.d/myapp
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp myapp
}

Explicación:

  • Rotar todos los archivos .log en /var/log/myapp/ diariamente
  • Mantener 7 días de logs
  • Comprimir logs antiguos (pero retrasar compresión por una rotación)
  • No dar error si faltan logs
  • No rotar logs vacíos
  • Crear nuevos logs con permisos y propietario específicos

Rotación Basada en Tamaño

# Configuración para logs de aplicación grandes
/var/log/application/app.log {
    size 100M
    rotate 5
    compress
    missingok
    notifempty
    create 0644 appuser appgroup
    dateext
}

Explicación:

  • Rotar cuando el log alcance 100MB
  • Mantener 5 copias rotadas
  • Agregar extensión de fecha a archivos rotados
  • Comprimir logs rotados inmediatamente

Rotación Semanal con Directorio Antiguo

/var/log/backup/*.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
    olddir /var/log/backup/old
    dateext
    dateformat -%Y%m%d
}

Explicación:

  • Rotar semanalmente (cada domingo)
  • Mantener 4 semanas de logs
  • Mover logs antiguos a directorio separado
  • Agregar formato de fecha personalizado a nombres de archivo

Configuraciones Avanzadas de Logrotate

Logs de Servidor Web (Nginx)

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi
    endscript
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    endscript
}

Características clave:

  • Rota diariamente, mantiene 2 semanas
  • Usa sharedscripts para ejecutar postrotate una vez
  • Señala a nginx para reabrir archivos de log después de la rotación

Servidor Web Apache

# /etc/logrotate.d/apache2
/var/log/apache2/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
    sharedscripts
    postrotate
        /usr/sbin/apache2ctl graceful > /dev/null 2>&1 || true
    endscript
}

Logs MySQL/MariaDB

# /etc/logrotate.d/mysql-server
/var/log/mysql/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 mysql adm
    sharedscripts
    postrotate
        if test -x /usr/bin/mysqladmin && \
           /usr/bin/mysqladmin ping &>/dev/null
        then
           /usr/bin/mysqladmin --local flush-error-log \
             flush-engine-log flush-general-log flush-slow-log
        fi
    endscript
}

Logs de Aplicación con Scripts Personalizados

# /etc/logrotate.d/custom-app
/var/log/custom-app/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0644 appuser appgroup
    dateext
    dateformat -%Y%m%d-%s
    maxsize 500M

    prerotate
        # Notificar sistema de monitoreo
        echo "Rotating logs for custom-app" | \
            logger -t logrotate

        # Respaldar logs críticos antes de rotar
        if [ -f /var/log/custom-app/critical.log ]; then
            cp /var/log/custom-app/critical.log \
               /backup/logs/critical-$(date +%Y%m%d).log
        fi
    endscript

    postrotate
        # Reiniciar aplicación para usar nuevo archivo de log
        systemctl reload custom-app.service

        # Actualizar índice de logs
        /usr/local/bin/update-log-index.sh
    endscript

    firstaction
        # Ejecutar antes de que se rote cualquier log
        mkdir -p /backup/logs
    endfirstaction

    lastaction
        # Ejecutar después de que todos los logs se hayan rotado
        /usr/local/bin/cleanup-old-backups.sh
    endlastaction
}

Múltiples Archivos de Log con Diferentes Políticas

# /etc/logrotate.d/multi-app
# Logs de acceso - alto volumen, retención corta
/var/log/multi-app/access.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 appuser appgroup
    size 100M
}

# Logs de error - mantener más tiempo
/var/log/multi-app/error.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 0644 appuser appgroup
    maxsize 50M
}

# Logs de auditoría - retención larga, sin compresión
/var/log/multi-app/audit.log {
    monthly
    rotate 24
    nocompress
    missingok
    notifempty
    create 0600 appuser appgroup
    dateext
    dateformat -%Y%m
}

Patrones Comodín

# Rotar todos los logs en múltiples directorios
/var/log/app1/*.log /var/log/app2/*.log /var/log/app3/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl reload app-logger.service
    endscript
}

# Excluir archivos específicos
/var/log/application/*.log {
    # Esto rotará todos los archivos .log excepto debug.log
    daily
    rotate 5
    compress
    missingok
    notifempty

    # Usar tabooext para excluir archivos
    tabooext + .debug
}

Copiar y Truncar para Archivos Abiertos

# Para aplicaciones que no soportan reapertura de logs
/var/log/legacy-app/app.log {
    daily
    rotate 7
    compress
    copytruncate
    missingok
    notifempty

    # Nota: copytruncate puede perder algunas entradas de log
    # durante la operación de copia
}

Estrategias de Compresión

Usando Diferentes Herramientas de Compresión

Gzip (predeterminado):

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/gzip
    compressoptions -9
    compressext .gz
}

Bzip2 (mejor compresión, más lento):

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/bzip2
    uncompresscmd /usr/bin/bunzip2
    compressext .bz2
    compressoptions -9
}

XZ (mejor compresión, más lento):

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/xz
    uncompresscmd /usr/bin/unxz
    compressext .xz
    compressoptions -9e
}

Zstd (compresión rápida con buena relación):

/var/log/app/*.log {
    compress
    compresscmd /usr/bin/zstd
    uncompresscmd /usr/bin/unzstd
    compressext .zst
    compressoptions -19
}

Estrategia de Compresión Diferida

# Mantener el log rotado más reciente sin comprimir
/var/log/app/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
}

# Resultado:
# app.log           (actual, sin comprimir)
# app.log.1         (ayer, sin comprimir)
# app.log.2.gz      (hace 2 días, comprimido)
# app.log.3.gz      (hace 3 días, comprimido)

Probando y Depurando Logrotate

Probar Sintaxis de Configuración

# Probar archivo de configuración específico
sudo logrotate -d /etc/logrotate.d/nginx

# Probar configuración principal
sudo logrotate -d /etc/logrotate.conf

# Salida de depuración detallada
sudo logrotate -dv /etc/logrotate.d/myapp

Forzar Rotación

# Forzar rotación incluso si no se cumplen las condiciones
sudo logrotate -f /etc/logrotate.conf

# Forzar configuración específica
sudo logrotate -f /etc/logrotate.d/nginx

# Forzar con salida detallada
sudo logrotate -fv /etc/logrotate.d/myapp

Prueba Manual de Rotación

# Probar rotación sin actualizar archivo de estado
sudo logrotate -d --state /tmp/logrotate-test.status /etc/logrotate.d/myapp

# Realizar rotación real con estado temporal
sudo logrotate --state /tmp/logrotate-test.status /etc/logrotate.d/myapp

Verificar Resultados de Rotación

# Verificar archivo de estado
sudo cat /var/lib/logrotate/status | grep myapp

# Listar logs rotados
ls -lht /var/log/myapp/

# Verificar creación de nuevo log
ls -l /var/log/myapp/app.log

# Verificar permisos del log
stat /var/log/myapp/app.log

Habilitar Logging de Logrotate

# Agregar a /etc/logrotate.conf o configuración específica
/var/log/myapp/*.log {
    daily
    rotate 7

    # Registrar eventos de rotación en syslog
    prerotate
        logger -t logrotate "Rotating myapp logs"
    endscript

    postrotate
        logger -t logrotate "Completed myapp log rotation"
    endscript
}

# Ver logs de rotación
sudo grep logrotate /var/log/syslog

Programación y Automatización

Ejecución Basada en Cron

Logrotate típicamente se ejecuta vía cron:

# Ver trabajo cron diario
cat /etc/cron.daily/logrotate

# Contenido típico:
#!/bin/sh
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

Programación Personalizada

Ejecutar logrotate cada hora:

# Crear script horario
sudo nano /etc/cron.hourly/logrotate-hourly

#!/bin/bash
/usr/sbin/logrotate /etc/logrotate.d/high-volume-app
# Hacer ejecutable
sudo chmod +x /etc/cron.hourly/logrotate-hourly

Programación cron personalizada:

# Editar crontab
sudo crontab -e

# Ejecutar a las 3 AM diariamente
0 3 * * * /usr/sbin/logrotate /etc/logrotate.conf

# Ejecutar cada 6 horas
0 */6 * * * /usr/sbin/logrotate /etc/logrotate.d/frequent-app

Timer Systemd

Crear timer systemd para logrotate:

# Crear unidad de timer
sudo nano /etc/systemd/system/logrotate.timer
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

Crear unidad de servicio:

sudo nano /etc/systemd/system/logrotate.service
[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

PrivateTmp=true

Habilitar e iniciar timer:

sudo systemctl daemon-reload
sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
sudo systemctl status logrotate.timer

# Listar programación de timer
systemctl list-timers logrotate.timer

Monitoreo y Alertas

Monitorear Éxito de Rotación

#!/bin/bash
# check-logrotate.sh - Monitorear ejecución de logrotate

STATUS_FILE="/var/lib/logrotate/status"
LOG_DIR="/var/log/myapp"
EMAIL="[email protected]"

# Verificar si la rotación ocurrió hoy
TODAY=$(date +%Y-%m-%d)
LAST_ROTATION=$(grep "$LOG_DIR" "$STATUS_FILE" | awk '{print $2}' | cut -d'-' -f1-3)

if [ "$LAST_ROTATION" != "$TODAY" ]; then
    echo "WARNING: Logrotate may not have run today for $LOG_DIR" | \
        mail -s "Logrotate Alert" "$EMAIL"
fi

# Verificar logs antiguos sin comprimir
OLD_LOGS=$(find "$LOG_DIR" -name "*.log.*" -not -name "*.gz" -mtime +2)
if [ -n "$OLD_LOGS" ]; then
    echo "Found old uncompressed logs: $OLD_LOGS" | \
        mail -s "Logrotate Compression Issue" "$EMAIL"
fi

Monitoreo de Espacio en Disco

#!/bin/bash
# monitor-log-space.sh - Alertar sobre tamaño de directorio de logs

LOG_DIR="/var/log"
THRESHOLD=80  # Porcentaje
EMAIL="[email protected]"

USAGE=$(df "$LOG_DIR" | tail -1 | awk '{print $5}' | sed 's/%//')

if [ "$USAGE" -gt "$THRESHOLD" ]; then
    {
        echo "WARNING: $LOG_DIR is ${USAGE}% full"
        echo ""
        echo "Largest log files:"
        du -sh "$LOG_DIR"/* | sort -rh | head -10
        echo ""
        echo "Logrotate status:"
        tail -20 /var/lib/logrotate/status
    } | mail -s "Log Directory Space Alert" "$EMAIL"
fi

Detección de Fallos de Rotación

#!/bin/bash
# detect-rotation-failures.sh

# Verificar rotaciones fallidas en syslog
ERRORS=$(grep logrotate /var/log/syslog | grep -i "error\|fail" | tail -10)

if [ -n "$ERRORS" ]; then
    echo "Logrotate errors detected:"
    echo "$ERRORS"
    echo "$ERRORS" | mail -s "Logrotate Errors Detected" [email protected]
fi

# Verificar archivos de log muy grandes (puede indicar fallo de rotación)
find /var/log -type f -size +1G -exec ls -lh {} \; | while read line; do
    echo "Large log file detected: $line"
    echo "$line" | mail -s "Large Log File Alert" [email protected]
done

Solución de Problemas Comunes

Problema 1: Logrotate No Se Ejecuta

Diagnóstico:

# Verificar si logrotate está instalado
which logrotate

# Verificar que el daemon cron esté ejecutándose
systemctl status cron  # Debian/Ubuntu
systemctl status crond # CentOS/Rocky

# Verificar trabajo cron
ls -l /etc/cron.daily/logrotate

# Probar ejecución manual
sudo /etc/cron.daily/logrotate

# Verificar errores
sudo logrotate -v /etc/logrotate.conf

Solución:

# Reinstalar logrotate
sudo apt install --reinstall logrotate

# Arreglar permisos de cron
sudo chmod +x /etc/cron.daily/logrotate

# Reiniciar daemon cron
sudo systemctl restart cron

Problema 2: Logs No Rotan

Diagnóstico:

# Verificar sintaxis de configuración
sudo logrotate -d /etc/logrotate.d/myapp

# Verificar que el archivo de log existe
ls -l /var/log/myapp/app.log

# Verificar archivo de estado
sudo grep "myapp" /var/lib/logrotate/status

# Probar forzar rotación
sudo logrotate -f /etc/logrotate.d/myapp

Causas comunes:

  • Directiva notifempty con log vacío
  • Umbral de tamaño no alcanzado
  • Ruta de archivo o permisos incorrectos
  • Errores de sintaxis en configuración

Solución:

# Eliminar notifempty si el log está vacío
# O asegurar que el log tenga contenido

# Arreglar permisos
sudo chown root:root /etc/logrotate.d/myapp
sudo chmod 644 /etc/logrotate.d/myapp

# Corregir errores de sintaxis
sudo logrotate -d /etc/logrotate.d/myapp

Problema 3: Errores de Permisos Denegados

Diagnóstico:

# Ejecutar con salida detallada
sudo logrotate -dv /etc/logrotate.d/myapp

# Verificar permisos de archivo de log
ls -l /var/log/myapp/

# Verificar usuario del proceso logrotate
ps aux | grep logrotate

Solución:

# Asegurar que logrotate se ejecute como root
sudo logrotate /etc/logrotate.conf

# Arreglar permisos del directorio de logs
sudo chmod 755 /var/log/myapp/
sudo chown myapp:myapp /var/log/myapp/*.log

# Actualizar directiva create
# En /etc/logrotate.d/myapp:
create 0644 myapp myapp

Problema 4: Fallo de Compresión

Diagnóstico:

# Verificar si la herramienta de compresión está instalada
which gzip

# Verificar configuración de compresión
sudo logrotate -dv /etc/logrotate.d/myapp | grep compress

# Verificar archivos comprimidos
ls -l /var/log/myapp/*.gz

Solución:

# Instalar herramienta de compresión
sudo apt install gzip

# Verificar espacio en disco
df -h /var/log

# Probar compresión manualmente
gzip -t /var/log/myapp/app.log.1.gz

# Eliminar compresión fallida
sudo rm /var/log/myapp/*.gz
sudo logrotate -f /etc/logrotate.d/myapp

Problema 5: La Aplicación No Escribe en el Nuevo Log

Diagnóstico:

# Verificar si se creó el nuevo archivo de log
ls -l /var/log/myapp/app.log

# Verificar permisos
stat /var/log/myapp/app.log

# Verificar proceso de aplicación
lsof | grep app.log

Solución:

# Usar copytruncate para aplicaciones que no pueden reabrir logs
/var/log/myapp/app.log {
    copytruncate
    daily
    rotate 7
}

# O agregar script postrotate para recargar aplicación
postrotate
    systemctl reload myapp.service
endscript

# O enviar señal para reabrir logs
postrotate
    kill -HUP $(cat /var/run/myapp.pid)
endscript

Mejores Prácticas

Organización de Configuración

# 1. Usar archivos de configuración separados por aplicación
/etc/logrotate.d/nginx
/etc/logrotate.d/mysql
/etc/logrotate.d/myapp

# 2. Usar nombres de archivo descriptivos
/etc/logrotate.d/application-access-logs
/etc/logrotate.d/application-error-logs

# 3. Documentar configuraciones inusuales
# /etc/logrotate.d/myapp
# Rotación especial para aplicación de alto volumen
# Rota cada hora vía cron.hourly en lugar de diariamente
/var/log/myapp/*.log {
    size 100M
    rotate 24
    compress
}

Consideraciones de Seguridad

# Asegurar archivos de configuración
sudo chmod 644 /etc/logrotate.d/*
sudo chown root:root /etc/logrotate.d/*

# Restringir acceso a logs
create 0640 appuser appgroup

# No enviar logs sensibles por correo
nomail

# Usar directorio antiguo seguro
olddir /var/log/secure-archive
create 0600 root root

Optimización de Rendimiento

# Usar compresión diferida para logs accedidos frecuentemente
delaycompress

# Comprimir en segundo plano para archivos grandes
compress
compressoptions -1  # Compresión rápida

# Usar sharedscripts para reducir sobrecarga
sharedscripts
postrotate
    systemctl reload nginx
endscript

# Limitar frecuencia de rotación para logs de alto volumen
size 500M
maxsize 1G

Políticas de Retención

# Logs de alto volumen a corto plazo
/var/log/app/access.log {
    daily
    rotate 7
    maxage 7
}

# Logs de error a mediano plazo
/var/log/app/error.log {
    weekly
    rotate 12
    maxage 90
}

# Logs de auditoría a largo plazo
/var/log/app/audit.log {
    monthly
    rotate 24
    maxage 730
    nocompress
}

Conclusión

Logrotate es una herramienta esencial para mantener una infraestructura de logging saludable en sistemas Linux. La configuración adecuada asegura que los logs se roten eficientemente, el espacio en disco se gestione efectivamente y los datos históricos se retengan según tus requisitos.

Puntos clave:

  1. Gestión automatizada - Logrotate maneja el ciclo de vida completo de los archivos de log sin intervención manual
  2. Políticas flexibles - Configurar rotación basada en tiempo, tamaño o ambos para satisfacer las necesidades de tu aplicación
  3. Estrategias de compresión - Equilibrar ahorro de espacio en disco con requisitos de acceso usando compresión apropiada
  4. Integración de aplicaciones - Usar scripts pre/postrotate para asegurar que las aplicaciones manejen la rotación de logs correctamente
  5. Monitoreo - Verificar regularmente que la rotación funcione como se espera y el espacio en disco esté bajo control

Al implementar las configuraciones y prácticas descritas en esta guía, mantendrás archivos de log manejables, prevendrás problemas de espacio en disco, asegurarás el cumplimiento de requisitos de retención y facilitarás el análisis eficiente de logs al solucionar problemas o investigar incidentes de seguridad.

Recuerda probar tus configuraciones de logrotate exhaustivamente antes de desplegar a producción, monitorear la ejecución de rotación regularmente y ajustar las políticas de retención a medida que tu capacidad de almacenamiento y requisitos de cumplimiento evolucionen.