PDA

Bekijk Volledige Versie : Apache acces log pipen



SebastiaanStok
16/04/05, 13:04
Standaart worden alle request naar de database weg geschreven met pglogd :)

Maar nu word het acces log van een ssl_request weg geschreven naar een ander bestand :(

Dit kan ik zo veranderen, maar dan vervalt het encryptie type :r

Dus heb ik op apache.org gekeken, je kan dus een acces log weg laten pipen naar een programa.

Dit heb ik gedaan met een php script.
Als ik in de terminal

ps -edaf|/data/htdocs/ssl_loging.php

Type schijft hij voor de test dit weg in een bestand, dus dat is goed :cool:

Maar als ik bij apache het acces log insteld.
CustomLog |/data/htdocs/ssl_loging.php pglogd

Dat verdomt hij het gewoon weg teschrijven :mad:

Weet iemand of pglogd hier een optie voor heeft dat hij toch een https request kan loggen met het encryptie type er bij, of hoe je apache kan laten pipen ?

Met vriendelijke Groet,

Sebastiaan Stok.

maxnet
16/04/05, 17:27
Hoe ziet je ssl_loging.php eruit?

Als je de regels met fputs() naar het bestand schrijft, moet je daarna fflush($filedescriptor); doen.

Anders komen de regels eerst in een geheugen buffer terecht en niet direct op schijf, waardoor het lijkt alsof hij niets wegschrijft.

SebastiaanStok
17/04/05, 11:24
Is dat altijd zo ? of alleen met apache ?

Wand als ik de gevens van weg pipe van ps -edaf dan schijft hij wel.

Ik zal het is proberen :)

maxnet
17/04/05, 20:26
Origineel geplaatst door Rollerscapes
Is dat altijd zo ? of alleen met apache ?

Wand als ik de gevens van weg pipe van ps -edaf dan schijft hij wel.


Op het moment dat "ps" klaar is, wordt het programma en je script afgesloten en wordt wat in de buffer staat wel weggeschreven.

Apache laat echter het pipelog programma de hele tijd op de achtergrond draaien.
Dan wordt het pas weggeschreven als de buffer vol zit, en dat kan even duren waardoor het lijkt alsof het niet werkt.

SebastiaanStok
18/04/05, 09:45
Zo roep ik hem aan.

CustomLog "|/data/apache2/bin/logresolve >> /data/htdocs/ssl_loging.php" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

Dit is het php script.
#!/usr/local/bin/php
<?php
error_reporting(E_ALL);

// read from stdin
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fflush($fd);
fclose($fd);

error_log($email, 3, "/data/htdocs/loging_test.log");
?>

Met chmod rechten: 755

maxnet
18/04/05, 09:56
while (!feof($fd)) {
$email .= fread($fd, 1024);
}


Wat je hier doet is dat je in blijft lezen tot er niets meer in te lezen valt (End Of File).
Dit gebeurt in dit geval alleen op het moment dat Apache de pipe sluit, hetgeen is wanneer het programma afsluit.

Wat je moet doen is regel voor regel inlezen, eventueel bewerken, en meteen weer wegschrijven.

Zoiets als dit (niet getest):



#!/usr/local/bin/php
<?

// invoer
$fd = fopen("php://stdin", "r");

// uitvoer
$outfd = fopen("/je-logbestand", "a");

while (!feof($fd)) {
// lees regeltje in
$regeltje= fgets($fd);
// schrijf regeltje weg
fputs($outfd, $regeltje);
// zorg dat het meteen weggeschreven wordt
fflush($outfd);
}

fclose($fd);
fclose($outfd);
?>

SebastiaanStok
18/04/05, 11:22
#!/usr/local/bin/php
<?php
error_reporting(E_ALL);
// invoer
$fd = fopen("php://stdin", "r");

// uitvoer
$outfd = fopen("/data/htdocs/loging_test.log", "a");


while (!feof($fd))
{
// lees regeltje in

$regeltje= fgets($fd);

// schrijf regeltje weg

fputs($outfd, $regeltje);

// zorg dat het meteen weggeschreven wordt

fflush($outfd);

}

fclose($fd);
fclose($outfd);
?>

Ik heb hem geprobeerd en nog doet hij het niet :(

SebastiaanStok
18/04/05, 13:45
Nou een beetje tweaken kom ik tot de conclusie dat het inderdaat in het weg schrijven zit :)

Nu moet ik nog iets maken waar mee ik het voormaat kan uit lezen.

Edit: kan iemand die expresie maken ?

Wand het wil weer is een keer niet lukken :mad: