Wie man Logrotate in Shell-Skripten implementiert

12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Ich möchte logrotate implementieren, um die Größe der Protokolldatei zu steuern. Wie kann ich das logrotate implementieren, wenn die oben beschriebene Situation vorliegt?

Veerendra
quelle

Antworten:

11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

Ich habe das "&" entfernt, da es ein Problem verursachen kann.

neugierig
quelle
@ Veerendra wir müssen die Logik des Rollens der Protokolle in die Schleife setzen, wie Sie eine Endlosschleife ausführen ..
neugierig
@ Veerendra wir hatten meinen vorherigen Beitrag einen Fehler .. "MV" wird keine neue Datei erstellen, aber Sie können das Skript entsprechend Ihren Anforderungen ändern.
neugierig
Kann ich also anstelle von cpund mvdie Protokolldatei entfernen, wird es dann eine neue Protokolldatei mit demselben Namen sein? (Wenn die Protokolldatei eine bestimmte Grenze erreicht, möchte ich diese Protokolldatei entfernen und anschließend eine neue Datei erstellen )
Veerendra
Sie sollten verwenden >>, um an die Protokolldatei anzuhängen. Sie >wird immer wieder überschrieben.
Alcik
Wenn ich verwende >, erhalte ich tail: test.log: file truncated Hello World!... Wenn ich verwende >>, erhalte ich die richtige Protokollmeldung, aber die Dateigröße nimmt zu. Keine Bedingung Überprüfung der Bedingung ... ;-(
Veerendra
23

wie wäre es mit savelog?

Es ist in Debian und RH und so ziemlich jeder anderen mir bekannten Linux-Distribution verfügbar. Es ist ein / bin / sh-Shell-Skript, sollte also auch auf jedem anderen Unix laufen.

zB bevor etwas geschrieben wird um zu test.loglaufen savelog -n -c 7 test.log. Dadurch bleiben die 7 neuesten nicht leeren Versionen von test.log erhalten. Standardmäßig werden gedrehte Protokolle komprimiert (dies kann jedoch mit deaktiviert werden -l).

Bei Bedarf können Sie die Größe von test.logund nur savelogdann überprüfen , wenn sie über einer bestimmten Größe liegt.

cas
quelle
Gibt es eine Idee, in welchem ​​Paket dies unter AWS Linux enthalten ist (ich glaube in der Nähe von CentOS)? Die Standardinstallation enthält kein Savelog. Ich kann es auch nicht mit Standard-Repos von yum finden
Jhonkola
savelog nicht in RHEL 5 gefunden. Wissen Sie, in welchem ​​Repo es sein sollte?
Felipe Alvarez
Keine Ahnung von Centos oder Rhel5-Paketen, aber Sie finden das /usr/bin/savelogShell-Skript unter sources.debian.net/src/debianutils/4.7
cas
2
Ich habe savelogauf keiner meiner RHEL / CentOS 5/6-Boxen etwas gefunden, also habe ich es nur ad hoc heruntergeladen und es scheint für meine Bedürfnisse in Ordnung zu sein.
Dale Anderson
Ein Nachteil savelogist, dass die Datei umbenannt wird, es dann aber lange dauert, bis die alten gzip-Dateien fertig sind. In der Zwischenzeit erhält das .0-Protokoll bereits Einträge für die nächsten Tage. Im Idealfall sollte die Zeit zwischen der Rotation des Protokolls und dem Signalisieren des Prozesses zum erneuten Öffnen des Protokolls minimal sein. Ich deaktiviere savelogdie Komprimierungsfunktion deswegen.
Rustyx
2

Ich habe an diesem Wochenende einen Logrotee geschrieben . Ich würde es wahrscheinlich nicht tun, wenn ich die großartige Antwort vonmultilog @ JdeBP gelesen hätte .

Ich habe mich darauf konzentriert, dass es leichtgewichtig ist und in der Lage ist, seine Ausgabestücke wie folgt zu bzip2:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Es gibt jedoch noch viel zu tun und zu testen.

Victor Sergienko
quelle
0

Da ich der akzeptierten Antwort noch keine Kommentare hinzufügen kann , ein BusyBox- Hinweis, bei dem dukein -bFlag vorhanden ist:

du /var/log/file | tr -s '\t' ' ' | cut -d' ' -f1
lnksz
quelle