Log-String parsen/auswerten
benni
- php
Hi!
Ich habe einen String (in einer Zeile einer Datei) der Form:
Nov 9 22:22:34 server kernel: BANDWIDTH_IN:IN=ppp0 OUT=eth0 SRC=207.46.2.59 DST=192.168.0.1 LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=30167 PROTO=TCP SPT=1863 DPT=3026 WINDOW=65247 RES=0x00 ACK PSH URGP=0
(IPTables-Logformat...)
Ich möchte aus diesem String mit PHP die einzelnen Werte, also immer das, was hinter dem = steht, auslesen und in einer jeweils spezifischen Variable speichern (um das ganze dann in eine MySQL-Tabelle zu schreiben). Also das ich zum Beispiel in der Variable $len den Wert 48 stehen hab.
Wie kriege ich das hin? Mir fällt keine vernünftige Kombination aus strpos & co. ein, da die Werte auch unterschiedliche Längen haben können. Es wird wohl also irgendwie auf reguläre Ausdrücke hinauslaufen, mit denen bin ich aber nicht wirklich bewandert.
Gibt es nicht vieleicht sogar schon eine Klasse, die mir das automatisch machen kann?
Eine weitere größere Schwierigkeit wäre es dann noch, den Datumsstring am Anfang in einen Unix-Zeitstempel umzuwandeln... aber daran will ich jetzt noch gar nicht denken... ;-)
Viele Grüße und besten Dank schonmal im Voraus,
Benni Graf.
Hi,
Es wird wohl also irgendwie auf reguläre Ausdrücke hinauslaufen,
richtig.
mit denen bin ich aber nicht wirklich bewandert.
Eine prima Gelegenheit, sie zu üben. Regular Expressions sind ein - sprachübergreifend - mächtiges Werkzeug, das einem allenthalben begegnet und vielerorts helfen kann. Es ist wichtig zu wissen, wie man sie einsetzt, und natürlich auch, wann man es nicht tut.
Gibt es nicht vieleicht sogar schon eine Klasse, die mir das automatisch machen kann?
Komisch, es sind immer nur die PHP-Entwickler, die für hochgradig spezielle Aufgaben eine allgemeine Funktionalität suchen. Immerhin fragst Du nach einer Klasse, das ist ja schon mal was.
Eine weitere größere Schwierigkeit wäre es dann noch, den Datumsstring am Anfang in einen Unix-Zeitstempel umzuwandeln... aber daran will ich jetzt noch gar nicht denken... ;-)
Gute Wahl. Gehe Schritt für Schritt vor. Zunächst einmal versuche Dich an einer RegExp, die Dir die gewünschten Informationen liefert.
Cheatah
Hi,
Komisch, es sind immer nur die PHP-Entwickler, die für hochgradig spezielle Aufgaben eine allgemeine Funktionalität suchen.
Das wundert Dich?
PHP sorgt doch wunderbar dafür, daß die Nutzer sich kaum noch mit Programmieren rumschlagen müssen, indem ihnen für alles mögliche Funktionen oder Befehle angeboten werden. "Schönes" Beispiel dafür sind URLs mit zig Parametern, die man oft sieht. Warum wohl? Weil es halt einfacher ist, die vorhandenen Funktionen zum Auswerten von GET-Parametern zu nutzen, als den String manuell auseinander zu nehmen.
Vielleicht weil ich kaum Ahnung von PHP habe und von anderen Programmiersprachen gewohnt bin, fast alles selbst zu programmieren, läßt sich z.B. dieses Bild http://andrealenzing.de/grafik/koepfe05.jpg in der Diashow aufrufen über
http://andrealenzing.de/dia.php?koepfe05
aber auch über
http://andrealenzing.de/dia.php?koepfe5
http://andrealenzing.de/dia.php?koepfe,5
http://andrealenzing.de/dia.php?koepfe,5,15
und sogar http://andrealenzing.de/dia.php?Bild=koepfe05.jpg&Intervall=60 würde funktionieren.;-)
freundliche Grüße
Ingo
Tag benni.
Nov 9 22:22:34 server kernel: BANDWIDTH_IN:IN=ppp0 OUT=eth0 SRC=207.46.2.59 DST=192.168.0.1 LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=30167 PROTO=TCP SPT=1863 DPT=3026 WINDOW=65247 RES=0x00 ACK PSH URGP=0
Ich möchte aus diesem String mit PHP die einzelnen Werte, also immer das, was hinter dem = steht, auslesen und in einer jeweils spezifischen Variable speichern (um das ganze dann in eine MySQL-Tabelle zu schreiben). Also das ich zum Beispiel in der Variable $len den Wert 48 stehen hab. Wie kriege ich das hin?
Das dürfte zu Fuß überhaupt kein Problem sein. Hole dir mit Hilfe von strrchr alles ab "IN=", zerlege den Reststring mit Hilfe von explode (der Trenner dürfte wohl ein Whitespace sein), gehe diesen Array Element für Element durch, teile den jeweiligen String in Name/Wert und ordne den Wert in Abhängigkeit vom Namen den gewünschten Variablen zu.
Ein regulärer Ausdruck wäre auch möglich, damit könntest du das in einem Rutsch erledigen. Interessant dürfte hier die Funktion preg_match sein.
Siechfred