Rotazione dei log guidata dallo spazio libero su Linux?


8

Qualcuno mi ha appena chiesto "per quanto tempo dovremmo conservare i registri per la nostra applicazione" e la mia risposta è stata "fino a quando il disco è pieno" poiché non c'è motivo di buttarli via se non a corto di spazio.

Tuttavia, logrotate standard vuole che specifichiamo un periodo specifico + numero di rotazioni. C'è qualcosa di simile che vorrebbe dire "ruota ogni giorno e conserva tutta la storia che desideri fino a quando non c'è solo il 5% di spazio libero"?

La piattaforma è Redhat Linux.


1
Mantenere i registri fino a quando il disco è pieno può essere applicato su ambienti fisici, ma poiché ci spostiamo principalmente su server virtuali e cloud, le dimensioni del file system dovrebbero essere le più ridotte possibile per ridurre i costi. In questo caso, non è possibile evitare di definire un criterio di conservazione.
jfg956,

Risposte:


9

Puoi forse usare le direttive firstaction o lastaction per chiamare uno script shell che verifica lo spazio libero su disco e quindi eseguire un'eliminazione sui file più vecchi.

   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.

Aggiornare:

Ecco un post di Stackoverflow sul tipo di script che puoi eseguire:

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


1

logrotate non ha questa opzione. Puoi aggiungere uno script cron che trova il registro più vecchio da rimuovere ogni volta che lo spazio libero scende al di sotto dei tuoi criteri. Puoi fare anche qualche altra validazione. Tuttavia, ottenere il disco troppo pieno in ogni momento non è una buona idea perché il sistema non sarà in grado di creare file temporanei di grandi dimensioni e potrebbe causare errori dell'applicazione.


Se hai tutto su un unico filesystem, potrebbe non essere una buona idea. Tuttavia, i miei registri sono sul proprio filesystem, al fine di evitare di interferire con qualsiasi altra cosa.
kdt

ah ok, se hanno le loro uniche fs, rende le cose semplici avere uno script per fare le pulizie, dh / fs e usare awk o cut per estrarre% usato, e in base a quella cifra, puoi dare il via a una ricerca con exec rm. spesso non scrivo una sceneggiatura e metto solo una riga nel crontab stesso.
johnshen64,

0

Volevo solo sottolineare che ci sono casi in cui non vuoi che i tuoi log riempiano tutto lo spazio disponibile su disco. Ho avuto a che fare con diversi host con directory thin provisioning / var e mantenere i log ad una certa dimensione era cruciale. Abbiamo usato un lavoro cronies insieme a logrorate per mantenere le dimensioni ridotte. Qualcosa di simile potrebbe essere usato nel tuo ambiente, sebbene un server di log centrale come splunk o syslog-ng sarebbe probabilmente un'opzione migliore.


0

Come suggerito da @cjc, puoi usare firstaction. Vedi questo esempio:

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

In questo esempio sono stati rimossi i file più grandi di 1 GB dalla partizione / mnt / user se lo spazio utilizzato dalla partizione è superiore al 50% .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.