¿Rotación de registro impulsada por espacio libre en Linux?

8

Alguien me preguntó 'cuánto tiempo deberíamos guardar registros para nuestra aplicación', y mi respuesta fue 'hasta que el disco esté lleno' ya que no hay razón para tirarlos aparte de quedarse sin espacio.

Sin embargo, logrotate estándar quiere que especifiquemos un período específico + número de rotaciones. ¿Hay algo similar que nos permita decir "rotar diariamente y mantener la mayor cantidad de historial que desee hasta que haya solo un 5% de espacio libre"?

La plataforma es Redhat Linux.

kdt
fuente
1
Mantener registros hasta que el disco esté lleno se puede aplicar en entornos físicos, pero como nos movemos principalmente a servidores virtuales y en la nube, el tamaño del sistema de archivos debe ser lo más pequeño posible para reducir los costos. En este caso, no puede evitar definir una política de retención.
jfg956

Respuestas:

9

Quizás pueda usar las directivas de primera estación o última estación para llamar a un script de shell que prueba el espacio libre en el disco y luego ejecutar una eliminación en los archivos más antiguos.

   firstaction/endscript
          The lines between firstaction and endscript (both of which must appear on lines by themselves) are
          executed (using /bin/sh) once before all log files that match the wildcarded pattern are  rotated,
          before  prerotate  script  is  run  and  only if at least one log will actually be rotated.  These
          directives may only appear inside a log file definition. Whole pattern is passed to the script  as
          first  argument.  If  the script exits with error, no further processing is done. See also lastac-
          tion.

Actualizar:

Aquí hay una publicación de Stackoverflow sobre el tipo de script que puede ejecutar:

/programming/7523059/remove-oldest-file-in-repository

cjc
fuente
1

logrotate en sí no tiene tal opción. Puede agregar un script cron que encuentre el registro más antiguo para eliminar cada vez que el espacio libre esté por debajo de sus criterios. También puedes hacer alguna otra validación. Sin embargo, no es una buena idea tener el disco demasiado lleno todo el tiempo porque el sistema no podrá crear archivos temporales grandes y podría causar fallas en la aplicación.

johnshen64
fuente
Si tiene todo en un sistema de archivos, puede que no sea una buena idea. Sin embargo, mis registros están en su propio sistema de archivos, para evitar interferir con cualquier otra cosa.
kdt
ah ok, si tienen sus únicos fs, simplifica las cosas tener un script para hacer la limpieza, dh / fs y usar awk o cut para extraer el% utilizado, y en función de esa cifra, puede iniciar un hallazgo con exec rm. a menudo no escribo un script y solo pongo una línea en el crontab.
johnshen64
0

Solo quería señalar que hay casos en los que no desea que sus registros llenen todo el espacio disponible en el disco. He tratado con varios hosts con directorios / var delgados aprovisionados y fue crucial mantener los registros a un cierto tamaño. Usamos un trabajo de compinches junto con logrorate para mantener el tamaño bajo. Algo similar podría usarse en su entorno, aunque un servidor de registro central como splunk o syslog-ng probablemente sería una mejor opción.

Tim Brigham
fuente
0

Como sugirió @cjc, puede usar la primera estación Ver este ejemplo:

/mnt/user/logs/*.log  /mnt/user/logs/*/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        su root www-data
        create 760 root www-data
        firstaction
          for file in `find  -type f -size +1024M`; do
              percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
              if [ $percent -gt 50 ]; then 
                  echo "Removed $file" >> /mnt/user/logs/logrotate.log
                  rm $file
              fi
           done;
        endscript
}

En este ejemplo, eliminó los archivos de más de 1 GB de la partición / mnt / user si el espacio utilizado es superior al 50% .

esguti
fuente