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 -F
es 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?
quelle
tail
", oder?Antworten:
Auf meinem Linux-System (GNU coreutils 8.12) konnte ich überprüfen (mit
strace
), dasstail -f
¹ denlseek
Systemaufruf verwendet, um den größten Teil der Datei schnell zu überspringen: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-inotify
für alle Fälle zu deaktivieren .quelle
strace
;)tail -F
nicht unterstützt wird, besteht die Möglichkeit, dassstrace
es nicht verfügbar ist…truss
ist das entsprechende Dienstprogramm unter Solaris.Wenn es in einer regulären Datei aufgerufen wird (im Gegensatz zu einer Pipe),
-n +N
suchen 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.quelle
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
exec
Funktionalität in,screen
da ich im Allgemeinen die gesamte Ausgabe sehen möchte (für vollständige Rückverfolgungen und Nachrichten im Zusammenhang mit dem Problem). Zum Beispiel,Damit das Terminal piept (oder blinkt), wenn das Wort Ausnahme gefunden wird.
quelle