Freiraumgesteuerte Protokollrotation unter Linux?

8

Jemand fragte mich nur, wie lange wir Protokolle für unsere Anwendung aufbewahren sollen, und meine Antwort lautete: "Bis die Festplatte voll ist", da es keinen Grund gibt, sie wegzuwerfen, außer dass der Speicherplatz knapp wird.

Standard-Logrotate möchte jedoch, dass wir einen bestimmten Zeitraum + Anzahl der Umdrehungen angeben. Gibt es etwas Ähnliches, das uns sagen lässt: "Täglich wechseln und so viel Geschichte behalten, wie Sie möchten, bis nur noch 5% Speicherplatz frei sind"?

Die Plattform ist Redhat Linux.

kdt
quelle
1
Das Aufbewahren von Protokollen, bis die Festplatte voll ist, kann in physischen Umgebungen angewendet werden. Da wir jedoch hauptsächlich auf virtuelle Server und Clouds umsteigen, sollte die Dateisystemgröße so klein wie möglich sein, um die Kosten zu senken. In diesem Fall können Sie die Definition einer Aufbewahrungsrichtlinie nicht vermeiden.
jfg956

Antworten:

9

Sie können möglicherweise die Direktiven firstaction oder lastaction verwenden, um ein Shell-Skript aufzurufen, das auf freien Speicherplatz prüft, und dann die ältesten Dateien zu löschen.

   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.

Aktualisieren:

Hier ist ein Stackoverflow-Beitrag über die Art des Skripts, das Sie ausführen können:

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

cjc
quelle
1

logrotate selbst hat keine solche Option. Sie können ein Cron-Skript hinzufügen, das das älteste zu entfernende Protokoll findet, wenn der freie Speicherplatz unter Ihre Kriterien fällt. Sie können auch eine andere Validierung durchführen. Es ist jedoch keine gute Idee, die Festplatte ständig zu voll zu machen, da das System keine großen temporären Dateien erstellen kann und Anwendungsfehler verursachen kann.

johnshen64
quelle
Wenn Sie alles in einem Dateisystem haben, ist dies möglicherweise keine gute Idee. Meine Protokolle befinden sich jedoch in einem eigenen Dateisystem, um zu vermeiden, dass etwas anderes behindert wird.
kdt
ah ok, wenn sie ihre einzigen fs haben, macht es die Sache einfach, ein Skript zu haben, um die Reinigung durchzuführen, dh / fs und awk oder cut zu verwenden, um% used zu extrahieren, und basierend auf dieser Zahl können Sie einen Fund mit exec starten rm. Ich schreibe oft kein Skript und setze einfach einen Einzeiler in die Crontab.
johnshen64
0

Ich wollte nur darauf hinweisen, dass es Fälle gibt, in denen Ihre Protokolle nicht den gesamten verfügbaren Speicherplatz ausfüllen sollen. Ich habe mich mit mehreren Hosts mit Thin Provisioned / Var-Verzeichnissen befasst, und es war entscheidend, die Protokolle auf einer bestimmten Größe zu halten. Wir haben einen Crony-Job in Verbindung mit logrorate verwendet, um die Größe gering zu halten. Ähnliches könnte in Ihrer Umgebung verwendet werden, obwohl ein zentraler Protokollserver wie Splunk oder Syslog-ng wahrscheinlich die bessere Option wäre.

Tim Brigham
quelle
0

Wie von @cjc vorgeschlagen, können Sie firstaction verwenden. Siehe dieses Beispiel:

/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 diesem Beispiel haben Sie Dateien mit mehr als 1 GB aus der Partition / mnt / user entfernt , wenn der verwendete Speicherplatz der Partition mehr als 50% beträgt .

esguti
quelle