C #: Endstück wie Programm für Textdatei

8

Ich habe eine Protokolldatei, die fortlaufend kurze Zeilen protokolliert. Ich muss einen Dienst entwickeln, der auf neue Zeilen, die dieser Datei hinzugefügt wurden, reagiert (oder abfragt oder hört), eine Art Unix-Tail-Programm, so dass mein Dienst immer auf dem neuesten Stand ist, was die Datei betrifft.

Ich denke nicht, dass es eine gute Idee ist, einen Lesestrom zu öffnen und geöffnet zu halten. Vielleicht sollte ich die FileSystemWatcher-Klasse verwenden.

Kurz gesagt, ich muss jede neue Zeile, die dieser Datei hinzugefügt wurde, in Echtzeit analysieren.

Jede Idee Hilfe oder Indikation wird wirklich geschätzt.

BEARBEITEN

Wie ich nicht sehr klar war. Ich brauche kein Programm, ich schreibe ein Programm. Zum Lesen (dann Bearbeiten) jeder neuen Zeile, die der Datei hinzugefügt wurde. Ich meine, was ich suche, ist eine Methode (oder: wie man das implementiert?) Für fortwährend tailing eine Datei, die weiter geschrieben wird.

Ich muss einen Windows-Dienst entwickeln, der auf diese Datei "hört" und Operationen auf jeder neuen Zeile ausführt.

Also, wenn in einem bestimmten Moment die Datei ist:

%Vor%

genau in dem Moment, in dem die Zeile

%Vor%

wird von dem Logging-Programm (auf das ich keinen Zugriff habe) zur Log-Datei hinzugefügt. Ich brauche meinen Windows-Dienst, um auf die Zeilenabhängigkeit "zu reagieren", fängt die neue Zeile ( 12.32.11 - pchorr [log on] 127 ) ab und verarbeitet sie. Und so weiter.

Nun, ich weiß nicht, wie ich das machen soll. Ich sollte die Datei alle n Sekunden abfragen, die letzte gelesene Zeile im Speicher speichern und nur die neu hinzugefügten Zeilen verarbeiten. Das Problem dabei ist, dass es sehr langsam ist, und ich würde jedes Mal eine sehr große Datei lesen.

Oder vielleicht könnte ich FileSystemWatcher verwenden, aber ich habe kein Beispiel dafür gefunden, es für ähnliche Zwecke zu verwenden.

Also, was würden Sie vorschlagen, um die Arbeit zu erledigen? Danke.

    
pistacchio 28.07.2009, 23:09
quelle

4 Antworten

9

Ich würde empfehlen, FileSystemWatcher zu verwenden, um über Änderungen an der Datei oder den Dateien, die Sie betreffen, benachrichtigt zu werden. Von dort würde ich Informationen wie die Größe der Datei zwischen Ereignissen zwischenspeichern und Logik hinzufügen, um nur auf volle Zeilen zu reagieren, usw. Sie können die Methode Seek() der Klasse FileStream verwenden, um zu einem bestimmten Punkt in zu springen die Datei und nur von dort lesen. Angesichts dieser Features sollte es nicht zu schwierig sein, diese Funktionalität manuell zu übertragen, wenn Sie das brauchen.

    
Lee 29.07.2009, 05:53
quelle
7

Eine einfache Lösung wäre die Verwendung eines Beispielcodes, der in Ссылка zur Verfügung gestellt wird. Es ist nur eine Funktion kopieren / einfügen in Ihren Code.

    
madhu 11.09.2012 09:30
quelle
1

Es ist wichtig zu beachten, dass Microsoft (seit vista / svr08) Datei-Metadaten nicht mehr aktualisiert, wenn eine Datei aktualisiert wird (z. B. wenn eine Protokolldatei von einem Dienst aktualisiert wird).

Beispielsweise werden die Metadaten für eine Datei wie das Änderungsdatum nicht aktualisiert, bis die Datei vom Service / Programm, das die Protokolldatei aktualisiert, geschlossen ist .

Daher wird FileSystemWatcher Protokolldateien NICHT wie erwartet abfangen.

Ссылка

    
Doc 29.07.2016 15:15
quelle
0

Sie haben nicht wirklich erklärt, ob Sie ein Heck-ähnliches Programm für Windows brauchen, zB Ссылка oder wenn Sie ein Fenster wollen Version von Tail (benutze Cygwin) oder wenn du nach einer Art Log-Monitoring-API suchst ....

    
Giorgio Galante 29.07.2009 01:59
quelle

Tags und Links