Ist es in Ordnung, tail -f für große Protokolldateien zu verwenden?

9

Ich möchte eine große Protokolldatei (nahe 1 GB) auf Fehler überwachen. Ich möchte, dass dies nahezu in Echtzeit erfolgt (Verzögerung von wenigen Sekunden ist in Ordnung). Mein Plan ist zu verwenden tail -f | grep. Gibt es Leistungsprobleme bei der Verwendung einer solchen Methode, wenn sie über einen längeren Zeitraum ausgeführt wird, z. B. von null Byte bis 1 GB? Gibt es Standardpraktiken für eine solche Überwachung? Beachten Sie, dass ich dies mit Standard-Unix-Befehlen tun möchte, die unter Solaris 10 verfügbar sind.

Wenn das möglich ist, rollt meine Datei sogar über und ich habe noch ein Problem zu lösen :). using tail -F( --follow=name) ist für mich keine Option, da -Fes auf dem Server, auf dem ich dies ausführen möchte, nicht unterstützt wird. Mein Plan ist es, ein Skript zu verwenden, das diesen Schwanz startet und abfragt, ob die Datei überrollt wird. Wenn ja, dann töte den Schwanz und starte ihn neu. Gibt es einen besseren Ansatz?

Manoj NV
quelle
Du meinst "töte die tail", oder?
Stéphane Gimenez
Ja, "Schwanz töten", nicht finden. Danke, bearbeitet die Frage
Manoj NV
1
Wie funktioniert Tail, wenn eine Datei mit einer Größe von 2 GB kein neues Zeilenzeichen enthält?

Antworten:

6

Auf meinem Linux-System (GNU coreutils 8.12) konnte ich überprüfen (mit strace), dass tail -f¹ den lseekSystemaufruf verwendet, um den größten Teil der Datei schnell zu überspringen:

lseek(3, 0, SEEK_CUR)                   = 0
lseek(3, 0, SEEK_END)                   = 194086
lseek(3, 188416, SEEK_SET)              = 188416

Dies bedeutet, dass die Größe der verfolgten Datei ohnehin keine Rolle spielen sollte.

Vielleicht können Sie überprüfen, ob dies auch für Ihr System gilt. (Offensichtlich sollte es der Fall sein.)

-
1. Ich habe auch versucht, die Inotify-Unterstützung mit undokumentierten Dateien ---disable-inotifyfür alle Fälle zu deaktivieren .

Stéphane Gimenez
quelle
2
Echte Männer lesen die Quelle (:
Gilles 'SO - hör auf böse zu sein'
2
@ Gilles. Ich kann dem OP (oder dem Leser) nicht beibringen, wie man die Quelle liest, wenn er es nicht bereits weiß. Viel einfacher zu sagen, dass er es benutzen soll strace;)
Stéphane Gimenez
Auf einem System, das tail -Fnicht unterstützt wird, besteht die Möglichkeit, dass stracees nicht verfügbar ist…
Stéphane Gimenez
trussist das entsprechende Dienstprogramm unter Solaris.
Gilles 'SO - hör auf böse zu sein'
und es zeigt ähnliche Suchanrufe. llseek (0, 0, SEEK_CUR) = 0, llseek (0, 0xFFFFFFFFFFF5FFF6, SEEK_END) = 7923269
jlliagre
5

Wenn es in einer regulären Datei aufgerufen wird (im Gegensatz zu einer Pipe), -n +Nsuchen sowohl das GNU-Tail als auch das OpenBSD-Tail (sofern nicht mit aufgerufen ) bis zum Ende der Datei und arbeiten dann rückwärts, um die Zeile zu finden, in der der Druckvorgang beginnen soll. Ich weiß nicht, ob Solaris dasselbe tut, aber es ist ein vernünftiger Ansatz, daher erwarte ich, dass die meisten Unices dasselbe tun. Daher ist die Größe der Datei für die Leistung irrelevant.

Gilles 'SO - hör auf böse zu sein'
quelle
2

Ich mache das jeden Tag. Normalerweise scanne ich ein Dutzend Protokolle auf unseren Test- und Produktionsservern mit tail -f logs/*.{log,err,out}. Das anfängliche Laden ist etwas viel (abhängig von der Anzahl der Dateien, die globalisiert werden), aber danach erfolgt das Streaming in Echtzeit.

Anstatt an grep zu senden, verwende ich die execFunktionalität in, screenda ich im Allgemeinen die gesamte Ausgabe sehen möchte (für vollständige Rückverfolgungen und Nachrichten im Zusammenhang mit dem Problem). Zum Beispiel,

!:sed -n s/.*Exception.*/\007/p

Damit das Terminal piept (oder blinkt), wenn das Wort Ausnahme gefunden wird.

Arcege
quelle