das sollte möglichst in "Echtzeit" geschehen.
Hi erstmal ,
folgendes Problem:
Ich möchte den letzten Eintrag einer Logdatei auslesen. Das sollte am besten so geschehen, dass sobald eine neue Zeile ins Log geschrieben wurde, mein Python Script das merkt und diese Zeile einliest.
Ich weiss, dass die per select (und dem event POLLIN) auf Netzwerk-Sockets möglich ist. Funtkioniert natürlich nicht mit "normalen" file-descriptoren.
Ich könnte natürlich per while 1: und read() die quasi immer lesen, das mag die CPU allerdings nicht so... (sprich 100% Auslastung)
Bietet Python dafür irgendwie ne fertige Lösung oder müsste ich tatsächlich einen kleinen "Server" schreiben, welcher das Log per select usw. liest, das ganze dann ins loopback leitet und von da ab ein "client" die Daten entgegen nimmt?
Meine aktuelle Lösung liest die letzte Zeile der Datei in einem Zeitintervall, was prinzipiell auch gut funktioniert. Allerdings will ich möglichst zeitnach, sprich sofort, auf neue Einträge im Log reagieren.
Falls ihr Vorschläge, Ideen oder sogar Lösungen habt, nur her damit
OTR
Datei auf neuen Inhalt überprüfen, aber
Die Überwachung des Dateisystems hängt vom Betriebssystem ab. Unter Linux musst Du Dich dazu mit inotify beschäftigen, unter Windows und anderen Unix-Derivaten kann ich Dir nicht helfen.
In jedem Fall schadet es bestimmt auch nicht, denn Quelltext von GNU "tail" zu lesen, das genau diese Funktionalität anbietet.
In jedem Fall schadet es bestimmt auch nicht, denn Quelltext von GNU "tail" zu lesen, das genau diese Funktionalität anbietet.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Man kann auch Gamin oder FAM verwenden, das läuft dann zumindest auch auf anderen Unices. Windows bietet dafür eigene Interfaces, aber das muss man höchstwarscheinlich dann irgendwie selbt integrieren.lunar hat geschrieben:Unter Linux musst Du Dich dazu mit inotify beschäftigen, unter Windows und anderen Unix-Derivaten kann ich Dir nicht helfen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Für Unix gibts noch:
http://pygstdocs.berlios.de/pygobject-r ... -add-watch
http://pygstdocs.berlios.de/pygobject-r ... -add-watch
Hi,
Erstmal Danke für die schnellen Antworten .
inotify und glib.IO_IN kommen dem was ich Suche ziemlich nah. Ich denke daraus lässt sich was basteln.
Hatte ich wohl vergessen zu erwähnen, es geht um Linux mit ext3.
OTR
Erstmal Danke für die schnellen Antworten .
inotify und glib.IO_IN kommen dem was ich Suche ziemlich nah. Ich denke daraus lässt sich was basteln.
Hatte ich wohl vergessen zu erwähnen, es geht um Linux mit ext3.
Das ist aber harter StoffIn jedem Fall schadet es bestimmt auch nicht, denn Quelltext von GNU "tail" zu lesen, das genau diese Funktionalität anbietet.
Werd ich mir definitv auch anschauen, da mein Script sowas in die Richtung auch erledigt.fail2ban überwacht Logfiles und ist in Python geschrieben. Der Code müsste sich dort irgendwo finden lassen.
OTR
Auf die Schnelle gehts auch mit read(), wie Du selbst ja schon gesagt hast:
Damit Dein Skript nicht die Prozessorzeit auffrisst, ist das sleep() in der Schleife wichtig.
Ist ein schneller Hack und funktioniert auch nicht unter Windows, mit inotify ist das definitiv schöner.
Code: Alles auswählen
import sys, time, random, string
if len(sys.argv) > 1:
with open('output','a') as f:
while True:
time.sleep(3)
s = ''.join(random.choice(string.letters) for i in xrange(10))
s += random.choice(['\n','','',''])
f.write(s)
f.flush()
print 'wrote: ', repr(s)
else:
with open('output') as f:
while True:
time.sleep(.1) # gibt der CPU etwas Ruhe ;)
sys.stdout.write(f.read())
sys.stdout.flush()
Ist ein schneller Hack und funktioniert auch nicht unter Windows, mit inotify ist das definitiv schöner.