Entfernen Sie die ersten N Zeilen aus einer aktiven Protokolldatei

23

Gibt es eine Möglichkeit, die erste zu entfernen N Zeilen aus einem Protokoll, das von einer Anwendung aktiv angehängt wird?

Adam Matan
quelle

Antworten:

9

Nein, Betriebssysteme wie Linux und ihre Dateisysteme bieten keine Möglichkeit, Daten vom Anfang einer Datei zu entfernen. Mit anderen Worten, der Startpunkt für die Speicherung einer Datei ist festgelegt.

Das Entfernen von Zeilen vom Anfang einer Datei wird normalerweise durch Schreiben der verbleibenden Daten in eine neue Datei und Löschen der alten erreicht. Wenn die alte Datei in einem Programm zum Schreiben geöffnet ist, wird die Löschung dieser Datei verschoben, bis die Anwendung die Datei schließt.


Wie die Kommentatoren bemerkt haben, müssen Sie aus den Gründen, die ich in meinem vorherigen Satz angegeben habe, in der Regel die Protokolldatei-Bereinigung mit den Programmen koordinieren, die die Protokolle schreiben. Wie Sie das genau machen, hängt von den Programmen ab. Einige Programme schließen ihre Protokolldateien und öffnen sie erneut, wenn Sie ihnen ein Signal senden (z. B. HUP). Dies kann verwendet werden, um zu verhindern, dass Protokollsätze in eine gelöschte Protokolldatei geschrieben werden, ohne den Dienst zu stören.

Es stehen viele Dienstprogramme zur Verfügung, um beispielsweise die Größe von Protokolldateien zu verwalten logrotieren

Einige Programme haben eigene Dienstprogramme. Zum Beispiel enthält der Apache-Webserver eine Rotatelogs Nützlichkeit.

RedGrittyBrick
quelle
3
Sie sollten dies jedoch nicht tun, solange die Datei noch geöffnet ist und noch an sie angehängt ist, da sie in die nun gelöschte Datei schreiben würde und Sie diese Protokollmeldungen verlieren würden.
Tarnay Kálmán
Wahr. Auch wenn Sie denselben Dateinamen verwendet haben.
Hennes
schade, dass die Betriebssysteme Sie nicht zulassen, das wäre sicher praktisch für Protokollierer, um Prozesse nach der Drehung nicht neu laden zu müssen:
rogerdpack
27

Ich denke, diese Aufgabe kann mit erreicht werden sed

sed -i '1,10d' myfile

würde die Zeilen von 1 entfernen st zu den 10 th Linie bilden die Datei.

Ich denke, jeder sollte sich wenigstens einen Blick darauf werfen dies sed 1 Liner .

Beachten Sie, dass dies nicht für Protokolldateien funktioniert, die von einer Anwendung aktiv angefügt werden (wie in der Frage angegeben).

sed -i erstellt eine neue Datei und "löscht" die Datei, in die geschrieben wird. Die meisten Anwendungen schreiben weiterhin Protokollsätze in die gelöschte Protokolldatei und füllen den Festplattenspeicher weiterhin aus. Die neue, abgeschnittene Protokolldatei wird nicht angehängt. Dies wird nur beendet, wenn die Anwendung neu gestartet wird oder auf andere Weise signalisiert wird, die Protokolldateien zu schließen und erneut zu öffnen. Ab diesem Zeitpunkt wird in der neuen Protokolldatei eine Lücke (fehlende Protokollsätze) angezeigt, wenn zwischen der Verwendung von sed und dem Neustart der Anwendung protokollierbare Aktivität aufgetreten ist.

Ein sicherer Weg, dies zu tun, wäre, die Anwendung anzuhalten, das Protokoll mit sed zu kürzen und die Anwendung anschließend neu zu starten. Dieser Ansatz kann für einige Dienste nicht akzeptabel sein (z. B. für einen Webserver mit hohem Durchsatz und hohen Anforderungen an die Dienstkontinuität).

l1zard
quelle
Wissen Sie, was mit den angehängten Anwendungen geschieht?
Adam Matan
hängt von der Anwendung ab. was benutzt du?
l1zard
Nehmen wir an, ein normaler Open File Handler, der ab und zu Zeilen anfügt und leert.
Adam Matan
dann können Sie es ohne -i und mit einer anderen Ausgabedatei verwenden. sed '1,10d' myfile > myfile.new. Verbringen Sie einfach ein paar Stunden, um zu verstehen, wie Sed funktioniert. Das ist es wert. :)
l1zard
7
Nein, das sollte nicht funktionieren. sed -i schafft ein neue Datei Der bearbeitete Inhalt wird entfernt und der alte wird entfernt, sodass Sie die aktive Datei nicht bearbeiten: $ ls -i --- 6823554 testfile --- $ sed -i 's/test/final/' testfile --- $ ls -i --- 6823560 testfile ------ Bitte überprüfen Sie, wie es geht sed -i Arbeit. Warum hat diese falsche Antwort so viele Upvotes?
pabouk
6

Nein. Eine Lösung für dieses generische Problem beim Wachstum von Protokolldateien ist die Protokollrotation. Dies betrifft die Regelmäßig (nachts oder wöchentlich, normalerweise) Verschieben einer vorhandenen Protokolldatei in einen anderen Dateinamen und neuer Start mit einer leeren Protokolldatei. Nach einiger Zeit werden die alten Protokolldateien weggeworfen.

Sehen: http://www-uxsup.csx.cam.ac.uk/~jw35/courses/apache/html/x1670.htm

Tarnay Kálmán
quelle
0

Vielleicht kopieren, kürzen, die Kopie wieder auf die Größe = 0 kürzen und die Kopie löschen?

Noch besser ist es, Tail to Tail zu kopieren, das Original und das Concat Tail Copy auf das Original zu kürzen.

Sie erhalten Zeilen im Protokoll bei Tail Length, also besser als eine Bytelängenbegrenzung.

Master James
quelle