Marcio Cunha

¿Disco lleno por logs? Cómo rotar con logrotate

Aprenda a configurar políticas de retención y compresión de logs en servidores de producción usando logrotate para evitar fallas por disco lleno.

Marcio Cunha•5 min
También disponible en:PortuguêsEnglish
Resumen
  • El crecimiento descontrolado de archivos de registro en servidores de producción suele agotar el espacio en disco y tumbar aplicaciones críticas de forma inesperada.
  • La utilidad logrotate automatiza el ciclo de vida de los registros de texto generados por servicios del sistema y aplicaciones sin requerir reinicios.
  • Las políticas de retención eficientes equilibran la necesidad de auditoría histórica con la preservación estricta del almacenamiento disponible en el servidor.
  • La compresión agresiva con algoritmos como gzip o zstd reduce drásticamente el volumen ocupado por los registros antiguos sin pérdida de datos esenciales.
  • Probar las reglas de rotación manualmente antes de llevarlas a producción previene fallas silenciosas en la entrega de nuevos archivos y pérdida de rastreabilidad.

El peligro silencioso del disco lleno por logs en producción

Cuando mantenemos aplicaciones corriendo en servidores de producción, la generación continua de registros textuales es fundamental para monitorear la salud del sistema y auditar accesos. Sin embargo, sin una estrategia adecuada de gestión, estos archivos crecen de manera exponencial hasta agotar todo el espacio disponible en el disco duro. En la práctica, esto significa que el sistema operativo pierde la capacidad de escribir archivos temporales, las bases de datos se bloquean por falta de espacio para transacciones y el servidor entero simplemente deja de responder. Es un escenario clásico donde el propio mecanismo creado para ayudarnos a diagnosticar problemas termina generando un fallo general por negligencia operativa.

Para evitar este tipo de desastre, la herramienta estándar en los sistemas operativos basados en Linux es la utilidad llamada logrotate, un programa auxiliar responsable de automatizar la limpieza, compresión y eliminación de archivos de registro antiguos. Antes de implementar cualquier política de retención, es muy útil comprender cómo diagnosticar el consumo de espacio en disco en el entorno. Tal como detallamos en nuestro artículo sobre ¿Docker sin espacio? Cómo limpiar caché y liberar disco, monitorear el uso de bloques e inodos es el primer paso para evitar paradas inesperadas en los servidores.

Cómo funciona el ciclo de vida de los logs con logrotate

El logrotate opera de forma programada, generalmente a través de una tarea programada en el sistema que se ejecuta todos los días en las primeras horas de la mañana. El proceso básico consiste en tomar el archivo de registro actual, renombrarlo agregando un sufijo numérico o fecha, crear un archivo vacío completamente nuevo para que la aplicación continúe escribiendo sin interrupciones y, opcionalmente, compactar el archivo antiguo para ahorrar espacio. Este ciclo evita que un único archivo de texto alcance decenas de gigabytes, lo que convertiría la apertura y búsqueda de fallas en una tarea extremadamente lenta para cualquier ingeniero.

Otro punto crítico de este proceso es garantizar que la aplicación en ejecución perciba que el archivo ha sido renombrado y comience a escribir en el nuevo archivo creado por el sistema. Si la aplicación mantiene el descriptor del archivo antiguo abierto en memoria, continuará volcando datos en el archivo renombrado, ocupando espacio en disco de la misma manera hasta que el proceso se reinicie. Para resolver esto, logrotate utiliza directivas de post-procesamiento, como la instrucción copytruncate o señales enviadas directamente al servicio para que reabra los archivos de registro de forma limpia y segura.

Escribiendo una política de retención robusta para servidores críticos

La configuración de logrotate se centraliza en archivos ubicados dentro de un directorio específico del sistema, donde cada aplicación puede tener su propia regla personalizada. Analicemos un ejemplo práctico de configuración para una aplicación web corporativa que genera registros intensos diariamente en un servidor de producción. Esta política garantiza la rotación diaria, mantiene el historial de los últimos treinta días, compacta los archivos antiguos y evita que la ausencia temporal de un archivo cause errores en la utilidad.

/var/log/mi-aplicacion/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 www-data adm
sharedscripts
postrotate
/usr/bin/systemctl reload mi-aplicacion.service > /dev/null 2>&1
endscript
}

Cada línea de este bloque de configuración cumple un papel decisivo en la estabilidad del servidor. La directiva daily fuerza la verificación y rotación cada 24 horas, mientras que rotate 30 define que solo los treinta archivos más recientes se mantendrán, borrando automáticamente los más antiguos. La opción compress compacta los registros usando la utilidad gzip, y delaycompress garantiza que el archivo rotado ayer solo se compacte en la rotación de mañana, evitando que procesos de escritura muy recientes entren en conflicto con la descompresión. Además, la directiva create define los permisos exactos de seguridad para el nuevo archivo generado.

Validando y probando políticas de logrotate antes de aplicar

Poner una nueva regla de rotación directamente en un entorno de producción sin pruebas previas es un riesgo innecesario que puede corromper registros o interrumpir el flujo de escritura de la aplicación. Logrotate ofrece una bandera de ejecución en modo de simulación, conocida como modo verboso y de prueba, que permite verificar exactamente qué acciones realizará el programa sin alterar ningún archivo real en el disco. Ejecutar esta verificación en la línea de comandos es un paso obligatorio de cualquier proceso de cambio de infraestructura.

Para realizar la prueba práctica de la configuración que creamos, ejecutamos el comando de simulación forzada apuntando al archivo de configuración específico. En la práctica, esto significa ejecutar la instrucción de abajo en la terminal del servidor y analizar atentamente cada línea de salida generada por el sistema.

sudo logrotate -d -f /etc/logrotate.d/mi-aplicacion

Analizar el informe generado por este comando ayuda a identificar errores de sintaxis, rutas incorrectas para los archivos de registro o fallas en la ejecución de los scripts de reinicio de servicios. Cuando tratamos con sistemas complejos, mantener la visibilidad sobre el comportamiento de los recursos es tan importante como solucionar el problema inmediato. Si te enfrentas a problemas relacionados con el comportamiento de servicios o cuellos de botella de E/S en la máquina, vale la pena revisar estrategias adicionales en nuestra guía sobre Container Docker bloqueado? Cómo revisar logs y volúmenes para ampliar tu repertorio de diagnóstico. Para profundizar en estos conceptos arquitectónicos en producción, consulte también nuestro análisis técnico sobre ¿Container sin red? Cómo debuguear CNI en Kubernetes.

Consideraciones finales sobre la automatización del ciclo de vida de logs

Gestionar el almacenamiento de registros en servidores de producción no se reduce a liberar espacio en disco de vez en cuando; se trata de construir una base operacional resiliente y predecible. La adopción correcta de logrotate combinada con pruebas rigurosas garantiza que el historial de auditoría y depuración permanezca accesible sin comprometer la estabilidad de la infraestructura subyacente. Al planificar cuidadosamente la frecuencia, la retención y la compresión de los datos generados por las aplicaciones, el equipo de ingeniería elimina sorpresas desagradables y asegura que el sistema siga operando con alto rendimiento, incluso bajo cargas elevadas de trabajo.