2012-08-02 7 views
5

Ich verwende tcpflow, um den Netzwerkverkehr auf einem Server zu protokollieren. Ich möchte diese Daten in eine Datei protokollieren, aber nicht alle davon. Der Überwachungsprozess würde im Hintergrund als Daemon auf unbestimmte Zeit ausgeführt werden.Wie kann ich einen unendlichen Textfluss vorverarbeiten, bevor ich ihn in eine Datei schreibe?

Einige Zeilen des Streams enthalten eine Bytezahl, und wenn ich diese Bytezahl (sagen wir 800 Bytes) sehe, dann muss ich die nächsten 800 Byte in die Datei schreiben. Wenn nicht, möchte ich nicht in die Datei schreiben.

Was ist der beste Weg für mich, diese Art von "On-the-Fly-Vorverarbeitung" des Streams zu machen, um zu entscheiden, was in die Log-Datei umgeleitet werden soll? Eine Art zweites Daemon-Skript, das den Stream abhört, der in das Skript geleitet wird?

Beispiel:

Ich sehe die folgende Zeile in dem Strom:

1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i:1:20163484235 0 0 1429

Zuerst muss ich prüfen, ob es sich um eine "set" hat. Dann untersuche ich das letzte Stück der Linie (1429), lese dann die nächsten 1429 Bytes und schreibe diese in eine Datei.

+0

Sieht aus wie tcpflow Filterausdrücke wie tcpdump – jordanm

+0

@jordanm unterstützt Ich glaube nicht, dass mir helfen. Hier ist eine Beispielzeile: '1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i: 1: 20163484235 0 0 1429' Ich muss zuerst sehen, dass die Zeile einen "Satz" hat, dann das letzte Stück der Linie (1429) untersuchen, dann die nächsten 1429 Bytes lesen und diese auf a schreiben Datei. – Tim

+0

In welcher Sprache schreiben Sie dies? In welcher Umgebung wird das ausgeführt? Tags "bash" und "php" sind verwirrend ... – tucuxi

Antwort

1

Ja, verwenden Sie ein Daemon-Programm, das den Stream als Eingabe verwendet und genau das tut, was Sie beschrieben haben. Ich würde C anstelle eines Skripts empfehlen, da es sehr einfache Eingabe/Ausgabe und sehr geringen Overhead hat.

Vorausgesetzt, dass Sie eine ausführbare Datei namens ‚Capture‘ und ein Filterprogramm namens ‚Filter‘, können Sie diese Kette zusammen aus einer Bash-Shell mit

bash-prompt$ capture capture-params | filter 

Alles, was capture zu stdout schreibt wird filter verfügbar sein als Eingabe von stdin. Aus Sicht des Filters ist es eine einfache Angelegenheit, Zeilen zu lesen, und wenn das Ende ... Größenmuster gefunden wird, schreibt man die Ausgabe in eine Ausgabedatei (oder wieder in stdout). Wenn Sie zu einem stdout schreiben, können Sie, dass in einer Datei

bash-prompt$ capture capture-params | filter > output-file.txt 
+0

Wie hake ich die beiden auf? Habe ich ein zweites C-Programm, um die Shell anzurufen, um das erste Programm zu starten, das den Stream erzeugt? Habe ich das erste Programm in eine temporäre Datei schreiben, die das zweite Programm liest? (Ich würde diese Lösung lieber nicht verwenden). – Tim

+0

Einige Beispiele für Verkettung mit bash hinzugefügt. Dies ist sehr viel "der Unix-Weg" Dinge zu tun: kleine Programme, die einzelne Dinge gut machen, werden zu größeren Programmen zusammengesetzt. – tucuxi

+0

Danke dafür. Würde also das "Filter" -Programm ein C-Programm sein, das im Grunde eine Endlosschleife ist, wiederholt stdin liest, es analysiert/verarbeitet und in stdout schreibt? Muss das Filterprogramm in C kompiliert werden? Kann es nur ein PHP-Skript sein? – Tim

0

mit umleiten Sie können mit awk on the fly Textverarbeitung erhalten. Sie müssen die Sprache lernen, aber ich benutze für ähnliche Aufgaben bei Live-Log-Parsing. Ich tail -f file.log | awk -f myscript.awk

Jede Zeile wird durch die awk-Skript erstellen Sie werden analysiert und mit if-then-else, Sie in der Zeile ein paar Worte erfassen kann und andere Teile des awk-Code aktivieren Sie die Zeile anders zu analysieren oder sogar externe Programme ausführen.

0

Bei weitem die eleganteste Anwendung für das, was Sie beschreiben, ist eine Low-Footprint-Round-Robin-Datenbank. RRDtool ist der OpenSource-Industriestandard für hochleistungsfähige Datenprotokollierung und -darstellung.

Mit einem Bash-Befehl können Sie Ihre Daten in die Datenbank eingeben, und wenn Sie möchten, ist die grafische Darstellung auch sehr einfach.

SEE: http://oss.oetiker.ch/rrdtool/gallery/index.en.html

Verwandte Themen