Sven Rautenberg: Backslash u.a. im Serverlog verhindern

Beitrag lesen

Moin!

bei mir steht:

in der httpd.conf
LogFormat "$M[] = array('du'=>'%{%Y-%m-%d %H:%M:%S}t', 'ah'=>'%h', 'vs'=>'%v', 'pu'=>'%U', 'qs'=>'%{Query_String}e', 'ci'=>'%{Cookie}i', 'rf'=>'%{Referer}i', 'ua'=>'%{User-Agent}i', 'fi'=>'%{X-Forwarded-For}i', 'bs'=>'%{Accept-Language}i', 'rd'=>'%T');" tractit

Damit versuchst du, ein PHP-Array herzustellen.

Damit wird ein Logfile erzeugt, welches von der nachfolgenden Software nur noch includiert werden braucht, um verarbeitet werden zu koennen, also alles sehr effektiv und performant.

Nein. Das ist nur dann performant und effektiv, wenn das Logfile klein bleibt. Dazu tendieren Logfiles aber nicht.

Effektiver, performanter etc. ist es, das Logfile im nativen Format schreiben zu lassen, und es dann zeilenweise einzulesen, um daraus die benötigten Statistiken zu generieren. Ein Array mit sämtlichen Transaktionen wird nicht dauerhaft benötigt - es nimmt aber mit Sicherheit sehr viel Speicherplatz weg, der PHP nicht zwingend zur Verfügung steht. Typische Erlaubnisse für Speicher liegen z.B. bei 8 MB - wird dein Logfile so groß, gerätst du in Speicherprobleme, die du grundsätzlich nur verhindern kannst, indem du grundsätzlich keine größeren Logfiles schreibst, also das Logfile häufig genug rotierst.

Es existiert aber keine Abhängigkeit zwischen Logfilegröße und vergangener Zeit. Wenn monatliches Rotieren bislang Logfiles im Bereich von 4 MB produziert hat, dann reicht es aus, einmal auf einer bekannten Seite verlinkt zu werden, und du hast innerhalb von wenigen Stunden die zehnfache Menge an Logdaten - was bei der nächsten Auswertung dann zum unsanften Crash deiner Applikation führt.

Deshalb: Wenn du es von Anfang an richtig machen willst, schreibst du deine Statistik so, dass sie mit dem zeilenweisen Einlesen von Logfiles, bei denen es im Grundsatz egal ist, wie groß sie sind, klarkommt - und dann hast du auch kein Escaping-Problem mit Backslashes und Anführungszeichen, die ihrerseits ja im Kontext "PHP-Stringinhalt" Sonderbedeutung kriegen, die sie als schlichtes URL-Zeichen nicht haben. Der Apache ist nicht dafür vorgesehen, PHP-array-aufbauende Logfiles zu schreiben.

Hat das Logfile eine bestimmte Groesse erreicht, wird es in einen temporaeren Ordner verschoben und bekommt eine Zeitmarke als Namen. Nach der Verarbeitung kommt es in die Endlagerstaette, wo es konserviert und in Watte gepackt wird ... ;-)

Das hoffst du? Oder das ist so eingerichtet?

- Sven Rautenberg

--
My sssignature, my preciousssss!