Datei auf neuen Inhalt überprüfen, aber

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
otr2k9
User
Beiträge: 2
Registriert: Dienstag 1. Dezember 2009, 04:55

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
lunar

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

otr2k9 hat geschrieben: Falls ihr Vorschläge, Ideen oder sogar Lösungen habt, nur her damit ;)
fail2ban überwacht Logfiles und ist in Python geschrieben. Der Code müsste sich dort irgendwo finden lassen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Unter Linux musst Du Dich dazu mit inotify beschäftigen, unter Windows und anderen Unix-Derivaten kann ich Dir nicht helfen.
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Such mal im Forum nach FileSystemWatcher.
MfG
HWK
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

otr2k9
User
Beiträge: 2
Registriert: Dienstag 1. Dezember 2009, 04:55

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.
In jedem Fall schadet es bestimmt auch nicht, denn Quelltext von GNU "tail" zu lesen, das genau diese Funktionalität anbietet.
Das ist aber harter Stoff ;)
fail2ban überwacht Logfiles und ist in Python geschrieben. Der Code müsste sich dort irgendwo finden lassen.
Werd ich mir definitv auch anschauen, da mein Script sowas in die Richtung auch erledigt.

OTR
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Auf die Schnelle gehts auch mit read(), wie Du selbst ja schon gesagt hast:

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()
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.
Antworten