Wie kann man eine Protokolldatei auf die letzten N Zeilen beschränken?

630
Bora M. Alper

Ich habe eine, ./programdie viele Protokollnachrichten ausgibt und außerdem sehr wenig Speicherplatz auf meinem VPS hat:

Ich würde meine Log-Datei gerne enthalten nur die neuesten N Linien die ganze Zeit (oder besser gesagt, wenn ich beenden ^Cmein Programm oder wenn er abstürzt ... )

A. Ich möchte nicht folgendes:

  1. Msgstr "Die Ausgabe in eine (Log-) Datei umleiten und dann tailnur die letzten N Zeilen behalten."

    Nun, die Log-Datei würde immer noch viel Platz tailbeanspruchen, bis ich darauf laufe, was es sinnlos macht ... Ich kann einen Cronjob periodisch einrichten, wenn ich keine andere Wahl habe, aber ich würde gerne die Möglichkeiten ausloten zuerst.

  2. "Verwenden Sie logrotate."

    logrotate scheint die richtige Lösung für das Problem zu sein, aber es ist zu umständlich und ich möchte etwas Einfacheres, am besten etwas, was ich mit Pipes und Weiterleitungen tun kann.

B. Ich habe folgendes versucht:

(ersetzt ./programmit seq 1000000if zum Testen)

  1. seq 1000000 | tee /dev/fd/2 | tail -n 10 > logfile

    Funktioniert einwandfrei, wenn es von alleine beendet wird, aber wenn ich ^Ces selbst unterbreche, logfileist das leer (während ich davon ausgehe, dass es die letzten 10 Zeilen enthält, die auf dem Bildschirm gedruckt werden tee).

  2. mkfifo fifo; tail fifo -n 10 > logfile & seq 1000000 | tee fifo

    Funktioniert einwandfrei, wenn es von alleine beendet wird, aber wenn ich ^Ces selbst unterbreche, logfileist das nicht leer, enthält jedoch nicht die neuesten Protokolleinträge, die auf dem Bildschirm angezeigt werden:

.

$ tail fifo -n 10 > logfile & seq 1000000 | tee fifo [1] 2616 1 2 3 ⋮ 480178 480179 480180 480181 480182 480183 ^C [1]+ Done tail fifo -n 10 > logfile $ cat logfile 479297 479298 479299 479300 479301 479302 479303 479304 479305 

Hier sehen Sie, dass die neuesten Einträge bei 480 Tausend liegen, wohingegen der letzte Eintrag bei logfile479.305 liegt ... was bedeutet, dass ich 878 letzte Zeilen vermisse! Ich denke, das hat etwas mit Pufferung zu tun, aber ich bin mir nicht sicher.

Kann mir jemand zeigen, wie dies mit Shell und (vorzugsweise Standard-) Linux-Dienstprogrammen geschieht? Vielen Dank!

0
Persönlich verwende ich einen cron, der jeden Tag um 12:12:12 Uhr läuft, um Protokolldateien zu löschen. Da sie täglich auf Größe reduziert werden, werden sie nie groß. Dieser cron generiert eine HTML-Datei in einer Datei, die in eine persönliche Statusseite aufgenommen wird (Mischung aus PHP und HTML), mit der ich schnell ein Auge auf Dinge haben kann. Tyson vor 6 Jahren 0

1 Antwort auf die Frage

0
Alex

Die einfachste Lösung für Ihren Fall ist wahrscheinlich das Umlaufprotokoll mit fester Größe.

Wenn Sie mit Linux arbeiten, können Sie das Kernel-Modul ausprobieren emlog

Das Emlog-Kernelmodul implementiert einen einfachen Zeichengerätetreiber. Der Treiber verhält sich wie eine Named Pipe, die über einen endlichen, kreisförmigen Puffer verfügt. Die Größe des Puffers ist leicht konfigurierbar. Wenn mehr Daten in den Puffer geschrieben werden, werden die ältesten Daten verworfen. Ein Prozess, der von einem Emlog-Gerät liest, liest zuerst den vorhandenen Puffer und sieht dann beim Schreiben neuen Text, ähnlich wie das Überwachen einer Protokolldatei mit "tail -f". (Nicht blockierendes Lesen wird auch unterstützt, wenn ein Prozess den aktuellen Inhalt des Protokolls abrufen muss, ohne zu blockieren, um auf neue Daten zu warten.)

Zu BSD-Systemen siehe CLOG(8)