Verwandeln einer Protokolldatei in eine Art Umlaufpuffer

22

Leute, gibt es eine * nix-Lösung, mit der die Protokolldatei als Ringpuffer fungiert? Zum Beispiel möchte ich, dass Protokolldateien maximal 1 GB Daten speichern und die älteren Einträge verwerfen, sobald das Limit erreicht ist.

Ist das überhaupt möglich? Ich glaube, um dies zu erreichen, sollte eine Protokolldatei in eine Art spezielles Gerät umgewandelt werden ...

PS Ich kenne verschiedene logrotierende Tools, aber das ist nicht das, was ich brauche. Das Logrotieren erfordert viel E / A und findet normalerweise einmal am Tag statt, während ich eine "Laufzeit" -Lösung benötige.

Pachanga
quelle
3
Ich bin nicht sicher, warum Sie denken, dass die Protokollrotation viele E / A-Vorgänge erfordern würde. Das Drehen von 10 Protokolldateien bedeutet 10 Umbenennungsvorgänge und ein HUP des Dienstes. Nicht gerade eine mörderische Operation ... Und es ist die Standardlösung für Ihr Problem :)
Pehrs
2
Möglicherweise wird ein Skript / eine ausführbare Datei ausgeführt, die mit HUP nicht gut funktioniert.
Scott
1
Dies ist ein weiterer Anwendungsfall für Ihre Frage. Ich habe einen dämonisierten Musikplayer. Ich möchte ein Protokoll mit einer Länge von nur mehreren Zeilen, damit ich sehen kann, was gespielt wird und was vorher gespielt wurde. A tail -f somefilewürde das tun. Ich habe es nur mit gedrehten Protokollen versucht und tail -farbeite damit nicht.
Vorac

Antworten:

14

Linux hat einen Kernel-Ringpuffer. Sie können verwenden dmesg, um es anzuzeigen .

Oder hier ist ein Linux-Kernel-Modul, das zu tun scheint, was Sie wollen.

Was ist Emlog?

emlog ist ein Linux-Kernelmodul, mit dem auf die aktuellste (und nur die aktuellste) Ausgabe eines Prozesses zugegriffen werden kann. Es funktioniert genauso wie "tail -f" in einer Protokolldatei, mit der Ausnahme, dass der erforderliche Speicherplatz nie größer wird. Dies kann in eingebetteten Systemen nützlich sein, in denen nicht genügend Speicher oder Speicherplatz für die Speicherung vollständiger Protokolldateien vorhanden ist, jedoch manchmal die neuesten Debugging-Meldungen benötigt werden (z. B. nachdem ein Fehler festgestellt wurde).

Das emlog-Kernelmodul implementiert einen einfachen Zeichengerätetreiber. Der Treiber verhält sich wie eine Named Pipe mit einem endlichen, kreisförmigen Puffer. 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 den neuen Text beim Schreiben, ähnlich wie beim Überwachen einer Protokolldatei mit "tail -f". (Nicht blockierende Lesevorgänge werden ebenfalls unterstützt, wenn ein Prozess den aktuellen Inhalt des Protokolls abrufen muss, ohne zu blockieren, um auf neue Daten zu warten.)

Bis auf weiteres angehalten.
quelle
1
Danke für den Link! Übrigens hat die emlog-Homepage einen Link zu ulogbufd, was für mich wahrscheinlich sogar eine passendere Lösung ist.
Pachanga
Das Emlog- Kernelmodul wird jetzt auf github gepflegt: github.com/nicupavel/emlog
dbernard
4

Das nächste, was ich mir vorstellen kann, ist RRDTools, aber wahrscheinlich ist es nicht das, wonach Sie suchen. Eine andere Lösung wäre, die Protokolldatei zu überwachen (z. B. jede Sekunde oder unter Linux mit inotify), z. B. schreiben Sie ein Skript wie:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

mit inotify:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done
Dan Andreatta
quelle
+1 für die Erwähnung von RRDtool, einem realen Beispiel für die Protokollierung der Ringdatenstruktur.
Cory J
Vielen Dank, zum Beispiel, dass inotifywait die Verwendung des Shell-Befehls anzeigt
pachanga
4

Sie können multilog von Daemontools von djb verwenden. Sie leiten Ihre Protokollausgaben hinein . Ja, es ist eine Log-Rotation, aber Rotationen sind einfach:

ln current $tai64nlocaltimestamp

Was auf fast jedem modernen Linux-Dateisystem eine superschnelle Operation ist. Sie können angeben, wie viele Protokolldateien und wie groß diese sein sollen. Wenn Sie 10 x 1024 MB große Dateien erstellen, haben Sie Ihren 1 GB großen Ringpuffer.

Beachten Sie, dass es sich aufgrund der automatischen Drehung um eine Quelle pro Multilog-Instanz handelt. Sie können dies jedoch umgehen, indem Sie einen einfachen Wrapper mit netcat oder von Hand schreiben.

Jason
quelle
Danke für den Tipp! Ich werde definitiv auch bei Multilog dabei sein.
Pachanga
1

Sie können eine FIFO-Pipe erstellen und diese dann mit einem Skript lesen, das in eine Datenbank eingefügt wird. Wenn der Zähler 1.000 erreicht, starten Sie die in die Datenbank eingefügte ID-Nummer erneut. Würde natürlich nicht für die Größe funktionieren, aber Sie haben das als Beispiel genommen, also gehe ich davon aus, dass dies eine theoretische Frage ist.

Sinping
quelle
1

Interessante Frage; Normalerweise sieht man das nicht als Design. Ich habe ein Programm, das eine etwas ähnliche Technik zum Aufzeichnen von Geschichte verwendet, aber es verwendet ein Binärformat. Die Protokolldatei besteht aus vier Teilen, die alle in einem maschinenneutralen Format angeordnet sind:

  1. Eine Kopfzeile, die die magische Nummer und die (maximale) Anzahl von Einträgen in der Liste der verwendeten und freien Einträge, die Folgenummer für den nächsten Verlaufseintrag, die tatsächliche Anzahl von Einträgen in der verwendeten Liste und die tatsächliche Anzahl von Einträgen in der freien Liste enthält und die Länge der Datei (jeweils 4 Byte).
  2. Die verwendete Liste, wobei jeder Eintrag einen Versatz und eine Länge angibt (4 Bytes für jeden Teil jedes Eintrags).
  3. Die freie Liste, wobei jeder Eintrag dem verwendeten Listeneintrag ähnlich ist.
  4. Die Hauptdaten, wobei jeder Verlaufsdatensatz aus einem zusammenhängenden Satz von Bytes besteht, die mit einem Null-Abschlussbyte abgeschlossen sind.

Wenn ein neuer Datensatz zugewiesen wird und in der freien Liste Platz vorhanden ist, überschreibt er dort einen Eintrag (wobei nicht unbedingt alles verwendet wird - in diesem Fall bleibt das Fragment auf der freien Liste). Wenn die freie Liste keinen Platz enthält, wird am Ende neuer Platz zugewiesen. Wenn ein alter Datensatz rotiert, wird sein Speicherplatz in die Liste der freien Datensätze verschoben und mit allen benachbarten freien Datensätzen zusammengeführt. Es ist für die Verarbeitung von SQL-Anweisungen ausgelegt, sodass die Datensätze über mehrere Zeilen verteilt werden können. Dieser Code kann für eine bestimmte Anzahl von Datensätzen verwendet werden. Die Größe der Datei per se ist nicht begrenzt (obwohl es nicht schwierig wäre, dies zu tun).

Der Hauptcode history code befindet sich in zwei Dateien, history.c und history.h, die aus dem Quellcode des Programms SQLCMD (meine Version, nicht die von Microsoft; meine existierte ein Jahrzehnt oder länger vor der von Microsoft) heruntergeladen werden können das Software-Archiv der International Informix User Group . Es gibt auch ein Speicherauszugsprogramm für Verlaufsdateien (histdump.c) und einen Verlaufstester (histtest.ec) - er behauptet, ESQL / C zu sein, ist jedoch selbst C-Code, und eine der aufgerufenen Unterstützungsfunktionen verwendet Informix ESQL / C Bibliotheksfunktionen). Kontaktieren Sie mich, wenn Sie ohne Informix ESQL / C experimentieren möchten - siehe mein Profil. Es müssen einige geringfügige Änderungen vorgenommen werden, damit der Histtest außerhalb seines Design-Milieus kompiliert werden kann. Außerdem benötigen Sie ein Makefile.

Jonathan Leffler
quelle
0

Ich stimme dem Kommentar von pehrs zu Ihrer Frage zu. Die Holzrotation ist nicht so schwer. Sie können logrotate oder ein anderes Skript einrichten, um Ihre Protokolldatei regelmäßig zu überprüfen, auf Wunsch sogar so oft wie jede Minute. Wenn festgestellt wird, dass Ihre Datei eine Größe von 1 GB erreicht, wird einfach eine Umbenennung durchgeführt, die so gut wie keine E / A-Vorgänge erfordert. Während des Umbenennens schreibt der Prozess die Protokolldatei weiter. Der Log - Rotator kann dann einen HUP an Ihren Syslog - Daemon senden (Ihr Daemon wird durch Syslog Protokollierung, nicht wahr? Wenn nicht, sollte es das HUP - Signal unterstützen , wenn es gut geschrieben ...) hat es den ursprünglichen Dateipfad wieder öffnen . Zu diesem Zeitpunkt beginnt das Schreiben in eine neue Datei unter dem ursprünglichen Pfad, und Sie können die gedrehte Version löschen.

Kamil Kisiel
quelle