Ein Skript, das ich geschrieben habe, führt etwas aus und hängt am Ende einige Zeilen an seine eigene Protokolldatei an. Ich möchte nur die letzten n Zeilen (z. B. 1000 Zeilen) der Protokolldatei behalten. Dies kann am Ende des Skripts folgendermaßen erfolgen:
tail -n 1000 myscript.log > myscript.log.tmp
mv -f myscript.log.tmp myscript.log
Aber gibt es eine sauberere und elegantere Lösung? Vielleicht mit einem einzigen Befehl erledigt?
text-processing
tail
logs
dr01
quelle
quelle
logrotate
ist die elegante LösungAntworten:
Dies ist möglich, aber wie bereits erwähnt, besteht die sicherste Option darin, eine neue Datei zu erstellen und diese dann zu verschieben, um das Original zu überschreiben.
Die folgende Methode lädt die Zeilen in BASH. Abhängig von der Anzahl der Zeilen von wirkt sich dies
tail
auf die Speichernutzung der lokalen Shell aus, um den Inhalt der Protokollzeilen zu speichern.Das Folgende entfernt auch leere Zeilen, falls diese am Ende der Protokolldatei vorhanden sind (aufgrund des Verhaltens der BASH-Auswertung
"$(tail -1000 test.log)"
), sodass nicht in allen Szenarien eine wirklich 100% genaue Kürzung erzielt wird. Je nach Ihrer Situation kann dies jedoch ausreichend sein.quelle
Das Dienstprogramm wurde
sponge
speziell für diesen Fall entwickelt. Wenn Sie es installiert haben, können Sie Ihre zwei Zeilen schreiben:Normalerweise ist es unzuverlässig, gleichzeitig mit dem Schreiben aus einer Datei zu lesen.
sponge
Behebt dies, indem erst geschrieben wird,myscript.log
nachdemtail
das Lesen beendet und die Pipe beendet wurde.Installieren
So installieren Sie
sponge
auf einem Debian-ähnlichen System:Um
sponge
auf einem RHEL / CentOS-System zu installieren , fügen Sie das EPEL-Repository hinzu und führen Sie dann Folgendes aus:Dokumentation
Von
man sponge
:quelle
sponge
. Sehr nützlich für alle, die auf die hartesort importantfile.txt > importantfile.txt
definitiv ist "tail + mv" viel besser! Aber für Gnus können wir es versuchen
quelle
Fürs Protokoll
ed
könnte man mit sowas machenDies öffnet
infile
undr
liest die Ausgabe vontail -n 1000 infile
(dh es fügt diese Ausgabe vor der ersten Zeile ein) und löscht dann von der ersten Zeile bis zum Ende der Datei. Ersetzen Sie,p
durchw
, um die Datei direkt zu bearbeiten.Beachten Sie jedoch, dass die
ed
Lösungen nicht für große Dateien geeignet sind.quelle
In Ihrem Skript können Sie die Logik der Protokollrotation implementieren. Führen Sie die gesamte Protokollierung über eine Funktion aus:
Diese Funktion bewirkt zum einen Folgendes:
dann überprüft es die Größe der Datei oder entscheidet auf irgendeine Weise, dass die Datei gedreht werden muss. Zu diesem Zeitpunkt wird die Datei
logfile.1
, falls vorhanden, entfernt, und die Dateilogfile.0
, falls vorhanden, wird in umbenanntlogfile.1
undlogfile
in umbenanntlogfile.0
.Die Entscheidung, ob gedreht werden soll, kann auf einem Zähler basieren, der im Skript selbst verwaltet wird. Wenn es 1000 erreicht, wird es auf Null zurückgesetzt.
Wenn immer ein striktes Trimmen auf 1000 Zeilen erforderlich ist, kann das Skript beim Start die Anzahl der Zeilen in der Protokolldatei zählen und den Zähler entsprechend initialisieren (oder wenn die Anzahl bereits 1000 erreicht oder übersteigt, die Drehung sofort ausführen).
Oder Sie können die Größe ermitteln, z. B. mit
wc -c logfile
und die Rotation basierend auf dem Überschreiten einer bestimmten Größe. Auf diese Weise muss die Datei niemals gescannt werden, um den Zustand festzustellen.quelle
Ich habe anstelle des Befehls
mv
dencp
Befehl verwendet, um zu erreichen, dass Sie in der Lage sind, einige Protokolldateien an der richtigen Stelle zu haben, an der eine Software ausgeführt wird. Vielleicht in den verschiedenen User Home Dir oder in den App Dir und haben alle Logs an einem Ort als Hardlinks. Wenn Sie denmv
Befehl verwenden, verlieren Sie die feste Verbindung. Wenn Siecp
stattdessen den Befehl verwenden, behalten Sie diesen festen Link bei.Mein Code ist so etwas wie:
Wenn sich die Dateien also auf demselben Dateisystem befinden, können Sie den Benutzern auch einige unterschiedliche Rechte erteilen und
${LOGFILE_DIR}
die Länge wie bei mir ändern.Wenn es der
mv
Befehl ist, verlieren Sie die feste Verbindung zwischen den Dateien, und Ihre zweite Datei ist nicht mehr mit der ersten verbunden - vielleicht haben Sie sie woanders platziert.Wenn Sie andererseits nicht zulassen, dass jemand die Datei löscht, bleiben Ihre Protokolle zusammen und können über Ihr eigenes Skript gesteuert werden.
logrotate
vielleicht schöner. Aber ich bin mit dieser Lösung zufrieden.Lassen Sie sich nicht durch das "" stören, aber in meinem Fall gibt es einige Dateien mit Leerzeichen und anderen Sonderzeichen. Wenn ich das "" nicht mache oder das {}, funktioniert das Ganze nicht gut.
Zum Beispiel gibt es ein Verzeichnis, in dem ältere Dateien automatisch komprimiert werden,
OLDFILE.zip
und alles, was komprimiert wird, ist auch in der Datei aufgeführt,.zip_log
also auch.zip_log
in diesem Verzeichnis, aber in dem, mit demLOGFILE_DIR
ich es habe:die gleiche Datei, wie es ein fester Link ist.
quelle