ubuntuusers.de

Apache Log Datei an PHP Script?

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

trunky

Anmeldungsdatum:
25. Januar 2006

Beiträge: 224

Hallo,

hat jemand zufällig Erfahrung damit, die Apache Logdateien an ein PHP Script weiterzureichen? Ich habe probiert das mit dem Custom Log zu machen per Pipe... geht aber nix. Das sieht momentan so aus

CustomLog /pfad/zum/access_log | /pfad/zum/php_script

nur leider passiert nichts (schwer zu erkennen 😉)

Hintergrund ist, ich möchte mit dem PHP die Einträge filtern, die ich später brauche und die dann in eine Datenbank schreiben um sie später zu verwursten. Gibt es da noch was besseres?

MfG

trunky

pafodie

Anmeldungsdatum:
27. Februar 2008

Beiträge: 24

wenn du durch CustomLog keine speziellen formatierungen vornimmst, kannst du doch eigentlich Datei direkt auswerten, oder? Zur Not machst du einen Symlink auf die Logdatei, wenn PHP nicht auf sie zugreifen darf.

trunky

(Themenstarter)

Anmeldungsdatum:
25. Januar 2006

Beiträge: 224

Ich möchte nur nicht alle x Zeit ein Script starten und die Datei neu einlesen.... deswegen dachte ich es wäre sinnvoller das gleich "wegschreiben" zu lassen.

trunky

(Themenstarter)

Anmeldungsdatum:
25. Januar 2006

Beiträge: 224

Hallo mal wieder 😉 Ich habe es inzwischen hingekriegt mit dem Apache Custom Log das access_log an ein PHP Script zu übergeben, für jeden Eintrag dort wird auch eine Zeile in die Datenbank geschrieben.... das Problem, jede Zeile ist leer.

Der Code im PHP sieht etwa so aus:

IP = $_SERVER['argv'][1];
$user = $_SERVER['argv'][3];
$time = $_SERVER['argv'][4];
...

...
$query = "INSERT INTO `access` ( `id` , `ip` , `user` , `time` , `url` , `os` , `browser` , `referrer` )  VALUES ('', '$IP', '$user', '$time', '$url', '$os', '$browser', '$referrer')";

Wie kriege ich denn nun die Daten, die übergeben werden (zumindest wird das Script ja immer aufgerufen) auch in die Variablen? Bitte um Hilfe!

trunky

the_alf

Anmeldungsdatum:
23. März 2008

Beiträge: 26

CustomLog /pfad/zum/access_log | /pfad/zum/php_script

Hi ob das so funktioniert weis ich nicht, dass hab ich noch nie probiert, aber da du ja schon mal leere Zeilen in deine DB bekommen hast, lässt das ja hoffen 😉

 
IP = $_SERVER['argv'][1];

Hier fehlt schon mal ein $-Zeichen also $IP und da du das ganze als Pipe an das PHP-Skript übergibst, gehe ich davon aus das es sich bei deinem Skript um ein PHP-CLI-Skript handelt. In diesen Skripten gibt es keine $_Server-Variablen. Dies ist wahrscheinlich auch der Grund, warum deine Zeilen leer sind. Die Zeile sollte also eher so aussehen:

$IP = $argv[1];

Hier noch eine Anmerkung zu deinem Insert. Ich denke mal das du die id-Spalte als AUTO_INCREMENT angelegt hast. Wenn du dies gemacht hast, dann kannst du dir an dieser Stelle normaleweise das id und ersten Hochkommas schenken, also statt

$query = "INSERT INTO `access` ( `id` , `ip` , `user` , `time` , `url` , `os` , `browser` , `referrer` )  VALUES ('', '$IP', '$user', '$time', '$url', '$os', '$browser', '$referrer')";

lieber so

$query = "INSERT INTO `access` ( `ip` , `user` , `time` , `url` , `os` , `browser` , `referrer` )  VALUES ('$IP', '$user', '$time', '$url', '$os', '$browser', '$referrer')";

Hoffe ich konnte dir helfen, gib mal rückinfo ob's geklappt hat.

trunky

(Themenstarter)

Anmeldungsdatum:
25. Januar 2006

Beiträge: 224

Hallo,

danke für die augenscheinlich qualifizierte Antwort 😉

Da fehlte tatsächlich ein $, war aber ein Copy & Paste Fehler.

Ich hab aus den $_SERVER[argv][1] jetzt argv[1] gemacht, aber es landen immer nur leere Zeilen in der Datenbank. Vielleicht wird das einfach anders übergeben, wenn es vom Logfile vom Apache kommt? Ich habe leider keine Ahnung davon und Google schweigt sich da auch ziemlich aus.

Was gibt es denn sonst noch für möglichkeiten das Logfile vom Apache auszuwerten? Ich will nur User, die sich per htaccess angemeldet haben sehen später und das möglichst "aktuell", also live, nicht erst abends. Und dazu jedes Mal das gesamte Log durchkauen erscheint mir etwas aufwendig...

trunky

the_alf

Anmeldungsdatum:
23. März 2008

Beiträge: 26

So da mich das Thema jetzt selbst interessiert hat, habe ich mal noch ein wenig rumprobiert. Die Zeile in der Apache-Config muss schon mal so aussehen

CustomLog "| /pfad/zum/php_script.php" common

Dann werden die Daten logischer Weise nicht als Parameter übergeben, sondern du musst sie vom Standart-Input lesen. Das kannst du in etwa so tun

1
2
3
4
5
6
7
$reader=fopen("php://stdin","r");
while (!feof($reader)) {
    $line = fgets($reader,4096);
    //In $line hast du nun die gesammte Log-Zeile mit der du weiter arbeiten kannst
    //also String untersuchen, zerlegen und ab in die Datenbank ;o)
}
fclose($reader);

Alternativ währe natürlich denkbar, das du die Authentifizierung gleich über PHP machst. Je nachdem wie deine jetzige Umgebung aussieht ist das mehr oder minder aufwendig. Ob es andere fertigte Tools gibt, die diese Aufgabe für dich LIVE erledigen weis ich nicht. Dazu hat mich das Thema bisher zu wenig interessiert, da müssen andere ran.

trunky

(Themenstarter)

Anmeldungsdatum:
25. Januar 2006

Beiträge: 224

Hallo the_alf,

die Zeile in der Apache-Config hatte ich auch, ich habe mir noch ein zusätzliches LogFormat definiert, was nur die "spannensten" Einträge enthält. Das Problem was ich bisher hatte mit meinem Script (das was die leeren Zeilen in die DB schreibt) ist, dass es nach ein paar Minuten den Apache lahmlegt. Also erst geht alles wunderbar aber nach 10 Minuten oder so antwortet der Apache nicht mehr, bis ich das CustomLog wieder auskommentiert habe. Komischerweise betrifft das nur den entsprechenden vhost und nicht den ganzen Apache. Na ich probiers mal mit deinem Script und geb dir Rückmeldung! Danke.

Antworten |