Seite 1 von 1

Datei auf neuen Inhalt überprüfen, aber

Verfasst: Dienstag 1. Dezember 2009, 05:28
von otr2k9
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

Verfasst: Dienstag 1. Dezember 2009, 06:52
von 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.

Re: Datei auf neuen Inhalt überprüfen, aber

Verfasst: Dienstag 1. Dezember 2009, 08:27
von /me
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.

Verfasst: Dienstag 1. Dezember 2009, 12:14
von Leonidas
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.

Verfasst: Dienstag 1. Dezember 2009, 14:33
von HWK
Such mal im Forum nach FileSystemWatcher.
MfG
HWK

Verfasst: Dienstag 1. Dezember 2009, 14:37
von ms4py

Verfasst: Dienstag 1. Dezember 2009, 19:55
von otr2k9
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

Verfasst: Dienstag 1. Dezember 2009, 20:16
von jerch
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.