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.
tail -f somefile
würde das tun. Ich habe es nur mit gedrehten Protokollen versucht undtail -f
arbeite damit nicht.Antworten:
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.
quelle
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:
mit inotify:
quelle
Sie können multilog von Daemontools von djb verwenden. Sie leiten Ihre Protokollausgaben hinein . Ja, es ist eine Log-Rotation, aber Rotationen sind einfach:
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.
quelle
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.
quelle
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:
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.
quelle
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.
quelle