Rotation des journaux en espace libre sous Linux?

8

Quelqu'un m'a simplement demandé «combien de temps devrions-nous conserver les journaux pour notre application», et ma réponse a été «jusqu'à ce que le disque soit plein» car il n'y a aucune raison de les jeter à part le manque d'espace.

Cependant, logrotate standard veut que nous spécifiions une période spécifique + nombre de rotations. Y a-t-il quelque chose de similaire qui nous permettrait de dire "tourner quotidiennement et garder autant d'historique que vous le souhaitez jusqu'à ce qu'il n'y ait que 5% d'espace libre"?

La plateforme est Redhat Linux.

kdt
la source
1
La conservation des journaux jusqu'à ce que le disque soit plein peut être appliquée aux environnements physiques, mais comme nous passons principalement aux serveurs virtuels et au cloud, la taille du système de fichiers doit être aussi petite que possible pour réduire les coûts. Dans ce cas, vous ne pouvez pas éviter de définir une politique de rétention.
jfg956

Réponses:

9

Vous pouvez peut-être utiliser les directives firstaction ou lastaction pour appeler un script shell qui teste l'espace libre sur le disque, puis exécuter une suppression sur les fichiers les plus anciens.

   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.

Mise à jour:

Voici un article Stackoverflow sur le type de script que vous pouvez exécuter:

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

cjc
la source
1

logrotate lui-même n'a pas une telle option. Vous pouvez ajouter un script cron qui trouve le journal le plus ancien à supprimer chaque fois que l'espace libre tombe en dessous de vos critères. Vous pouvez également effectuer une autre validation. Cependant, obtenir un disque trop plein tout le temps n'est pas une bonne idée car le système ne sera pas en mesure de créer de gros fichiers temporaires et pourrait provoquer des échecs d'application.

johnshen64
la source
Si vous avez tout sur un seul système de fichiers, ce n'est peut-être pas une bonne idée. Cependant, mes journaux sont sur leur propre système de fichiers, afin d'éviter de gêner quoi que ce soit d'autre.
2012
ah ok, s'ils ont leur seul fs, il est simple d'avoir un script pour faire le nettoyage, dh / fs et utiliser awk ou cut pour extraire le% utilisé, et sur la base de ce chiffre, vous pouvez lancer une recherche avec exec rm. souvent, je n'écris pas de script et je mets juste une ligne dans la crontab elle-même.
johnshen64
0

Je voulais juste souligner qu'il y a des cas où vous ne voulez pas que vos journaux remplissent tout l'espace disque disponible. J'ai traité avec plusieurs hôtes avec des répertoires / var provisionnés et il était crucial de conserver les journaux à une certaine taille. Nous avons utilisé un travail de copains en conjonction avec logrorate pour réduire la taille. Quelque chose de similaire pourrait être utilisé dans votre environnement, bien qu'un serveur de journalisation central comme splunk ou syslog-ng serait probablement une meilleure option.

Tim Brigham
la source
0

Comme l'a suggéré @cjc, vous pouvez utiliser firstaction. Voir cet exemple:

/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
}

Dans cet exemple, vous avez supprimé les fichiers de plus de 1 Go de la partition / mnt / user si l'espace utilisé par la partition est supérieur à 50% .

esguti
la source