[php] Log file uitlees filter probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • redpen
  • Registratie: Maart 2003
  • Laatst online: 13-08 23:44
ik heb net een topic geopend ik weet het maar ik was nog niet klaar met het editen of het was al dicht

anyhoe ik probeer het nog eens en nu wat duidelijker als eerst

ik heb het volgende gebrouwd

ik ben nu een kleine poos bezig om een log file analyser te maken voor mijn dnetc proxy ik krijg van 5 mensen packetjes opgestuurd en php lees deze uit maar nu heb ik een klein probleempje

dit heb ik nu

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
header ("Content-type: image/gif");
$content=file("/hds/schd3/koeproxy/pproxyrc57220031030.log");
$teller=count($content);
$tekst = "$teller ,paketjes"; 
$font = 4; 
$im = imagecreate ($teller,15); //grote van de afbeelding
$background = imagecolorallocate ($im, 150, 150, 150);  //achtergrondkleur instellen
$text_color = imagecolorallocate ($im, 50, 50, 50); //tekstkleur instellen
imagestring ($im, $font, 0, 0, $tekst,  $text_color); //de image maken//
imagepng ($im);
imagedestroy ($im);
?>


deze zorgt ervoor dat hij het bestand leest en daarna het aantal regels optelt en laat zien in een balkje hoeveel regels erin zitten

nu moet ik alleen proberen zodat dit script alleen de regels waar een bepaald ip in voorkomt op doet tellen

ff een voorbeeld van de log file

je moet hier die php tekens etc weg denken wat het is gewoon alleen die regels
dus op dit moment lees hij gewoon alles uit en telt het op

maar ik zou graag willen dat hij leest o ip 127.0.0.1 die optellen en de andere niet

nou had ik zelf wel wat geprobeerd maar ik kom er niet uit welke functie kan je zo gebruiken om een regel in variabelen om te zetten en daarna in arrays of iets dergelijks te zetten zodat ik daarna kan zeggen als dit of dat ip erin zit dan deze regel optellen bij de andere


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2003-10-30 08:13:25,127.0.0.1,teambvd@teambvd.com,CA:68FC126B:00000000,1,4,1,90050483,1 
2003-10-30 08:13:25,127.0.0.1,teambvd@teambvd.com,CA:68FBFA27:00000000,1,4,1,90050483,1 
2003-10-30 08:13:25,127.0.0.1,teambvd@teambvd.com,CA:68FBFA26:00000000,1,4,1,90050483,1 
2003-10-30 08:13:25,127.0.0.1,teambvd@teambvd.com,CA:68FBFA25:00000000,1,4,1,90050483,1 
2003-10-30 08:13:25,127.0.0.1,teambvd@teambvd.com,CA:68FBED49:00000000,1,4,1,90050483,1 
2003-10-30 08:13:25,127.0.0.1,teambvd@teambvd.com,CA:68FBED48:00000000,1,4,1,90050483,1 
2003-10-30 08:13:38,81.69.52.238,teambvd@teambvd.com,CA:68FDCDB0:00000000,1,4,1,90050483,5 
2003-10-30 08:13:38,81.69.52.238,teambvd@teambvd.com,CA:68FDCDAF:00000000,1,4,1,90050483,5 
2003-10-30 08:56:34,127.0.0.1,teambvd@teambvd.com,CA:688E3F15:00000000,1,4,1,90050483,1 
2003-10-30 09:39:23,81.69.52.238,teambvd@teambvd.com,CA:68FDAFD7:00000000,1,1,1,90050483,1 
2003-10-30 09:39:23,81.69.52.238,teambvd@teambvd.com,CA:68FDAFD6:00000000,1,1,1,90050483,1 
2003-10-30 09:39:23,81.69.52.238,teambvd@teambvd.com,CA:68FDAFD4:00000000,1,1,1,90050483,1 
2003-10-30 09:39:23,81.69.52.238,teambvd@teambvd.com,CA:68FDAF86:00000000,1,1,1,90050483,1 
2003-10-30 09:39:30,127.0.0.1,teambvd@teambvd.com,CA:688E3F16:00000000,1,4,1,90050483,1 
2003-10-30 10:45:03,81.69.52.238,teambvd@teambvd.com,CA:68FDB038:00000000,1,1,1,90050483,1 
2003-10-30 10:45:03,81.69.52.238,teambvd@teambvd.com,CA:68FDB037:00000000,1,1,1,90050483,1 
2003-10-30 10:45:03,81.69.52.238,teambvd@teambvd.com,CA:68FDAFD8:00000000,1,1,1,90050483,1 
2003-10-30 10:48:16,212.182.171.99,teambvd@teambvd.com,CA:693AA781:00000000,1,1,1,90050483,5 
2003-10-30 11:08:04,127.0.0.1,teambvd@teambvd.com,CA:688E3F26:00000000,1,4,1,90050483,1 
2003-10-30 11:08:04,127.0.0.1,teambvd@teambvd.com,CA:688E3F18:00000000,1,4,1,90050483,1 
2003-10-30 11:08:04,127.0.0.1,teambvd@teambvd.com,CA:688E3F17:00000000,1,4,1,90050483,1

beter 10 servers in de lucht dan 1 op de grond


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

redpen schreef op 30 oktober 2003 @ 13:20:
ik heb net een topic geopend ik weet het maar ik was nog niet klaar met het editen of het was al dicht
Gebruik de knop 'Bekijk bericht' dan, naderhand editen om het duidelijk te maken schiet ook niet op als honderden bezoekers je half-af bericht onder ogen krijgen :) Daarnaast kan ik natuurlijk niet ruiken dat je nog aan het editen bent, ik beschouw iedere post die ik tegenkom als definitief en geplaatst.

enne die [php] tag in de titel hoef je niet af te sluiten hoor :Y)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

PHP:
1
2
$content = file('path/to/bestand.log');
$var = explode(",", $content);

[ Voor 56% gewijzigd door dArtagnan op 30-10-2003 13:30 ]


Acties:
  • 0 Henk 'm!

  • redpen
  • Registratie: Maart 2003
  • Laatst online: 13-08 23:44
ja ok ik heb nu de code wat aangepast en die functie wat jij zij ingevoerd maar hoe roep ik nou de onderlinge dingen aan ?

dus bij ik wil kijken o ip zit erin optellen
of o ip zit er niet in volgende

heb nu

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
header ("Content-type: image/gif");
$filename = ("/hds/schd3/koeproxy/pproxyrc57220031030.log");
$fp = fopen($filename, "r") or die("Couldn't open file");
$var = explode(",", $fp);

$teller=count($content);
$tekst = "$teller ,paketjes"; 
$font = 4; 
$im = imagecreate ($teller,15); //grote van de afbeelding
$background = imagecolorallocate ($im, 150, 150, 150);  //achtergrondkleur instellen
$text_color = imagecolorallocate ($im, 50, 50, 50); //tekstkleur instellen
imagestring ($im, $font, 0, 0, $tekst,  $text_color); //de image maken//
imagepng ($im);
imagedestroy ($im);
?>

[ Voor 61% gewijzigd door redpen op 30-10-2003 13:33 ]

beter 10 servers in de lucht dan 1 op de grond


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Mja een array exploden wordt wat lastig denk ik...

Kijk eens naar fgets() zou ik zeggen. Lees regel voor regel in en voeg pas toe als het IP klopt. Dit kun je checken met die explode, of gewoon met een preg_match()

Suc6

//edit: ow IP staat ook nog op een vaste plaats, dus die preg_match kun je vervangen door een functie als strpos/substr etc

[ Voor 23% gewijzigd door Morrar op 30-10-2003 13:35 ]


Acties:
  • 0 Henk 'm!

  • redpen
  • Registratie: Maart 2003
  • Laatst online: 13-08 23:44
Morrar schreef op 30 oktober 2003 @ 13:33:
Mja een array exploden wordt wat lastig denk ik...

Kijk eens naar fgets() zou ik zeggen. Lees regel voor regel in en voeg pas toe als het IP klopt. Dit kun je checken met die explode, of gewoon met een preg_match()

Suc6
ja dat kan denk ik ook wel maar het is het voordeel (of juist nadeel) dat ik alleen hoef te kijken staat dit ip in de regel dan 1 paketje tellen
en zo alle regels nagaan todat ze allemaal geweest zijn

maar wat voor code krijg ik dan ?

dus dat hij die file gewoon inleest helemaal
en daarna ?

want eigenlijk hoef hij alleen te kijken of er bijv 127.0.0.1 instaat en die dan gewoon als 1 tellen en dan de rest van de regels


als hij dan bijv alles in een array zet ?
dan kan hij toch gewoon kijken of er in die array die volg orde voorkomt van nummers net zoon beetje als dat string replace ding

[ Voor 30% gewijzigd door redpen op 30-10-2003 13:41 ]

beter 10 servers in de lucht dan 1 op de grond


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

PHP:
1
2
3
4
5
6
7
8
9
10
$content = file('path/to/bestand.log');

for($i = 0, $i < count($content), $i++)
{
   $var = explode(",", $content[$i]);
   if ($var[1] == "127.0.0.1")
   {
      // ja, 127.0.0.1 is gevonden
   }
}

[ Voor 57% gewijzigd door dArtagnan op 30-10-2003 13:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt beter met regexp gaan werken en dan met preg_match..

http://nl.php.net/preg_match voor uitleg over deze (handige) function en over regular expressions :)

Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Ok, wat code dan maar

PHP:
1
2
3
4
5
6
7
8
$log_file = fopen('/path/to/logfile', 'r');
while(!feof($log_file))
{  $curr_line = fgets($log_file, 4096);
     if(strpos($curr_line, '127.0.0.1') == 20) //20 als ik goed geteld heb
     {    $count++;
     }
}
fclose($log_file);


Loopt over de regels en telt als het ip 127.0.0.1 op een bepaalde positie in de regel voorkomt. $count is dus het aantal regels dan.

//edit:
Je kunt beter met regexp gaan werken en dan met preg_match..

http://nl.php.net/preg_match voor uitleg over deze (handige) function en over regular expressions
preg_match is regexp toen ik voor het laatst keek hoor. Perl RegExp engine (verneukte versie dan) zelfs om wat specifieker te zijn...

//edit2:
Deze code is sneller/efficienter imho dan alles inlezen en daarna nog es gaan exploden

[ Voor 46% gewijzigd door Morrar op 30-10-2003 13:52 ]


Acties:
  • 0 Henk 'm!

  • redpen
  • Registratie: Maart 2003
  • Laatst online: 13-08 23:44
k alleen een vraagje wat meot er op die plaats van

<pos_in_string>

de string het nummer van waar het ip nummer staat of wat ?

ja dus

hmm werkt dan niet meer als de datum bijv korter of langer word right ?

o btw als ik er 20 invul dan krijg ik

<b>Warning</b>: feof(): supplied argument is not a valid File-Handle resource in <b>/var/www/html/statswerk.php</b> on line <b>5</b><br />
<br />

en helemaal boven aan staat <br />
<b>Warning</b>: Wrong parameter count for fopen() in <b>/var/www/html/statswerk.php</b> on line <b>4</b><br />
<br />


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
header ("Content-type: image/gif");

$log_file = fopen('/hds/schd3/koeproxy/pproxyrc57220031030.log'); 
while(!feof($log_file)) 
{  $curr_line = fgets($log_file, 4096); 
 
     if(strpos($curr_line, '127.0.0.1') == 20) { 
        $count++; 
     } 
} 
fclose($log_file);

$teller=$count;
$tekst = "$teller ,paketjes"; 
$font = 4; 
$im = imagecreate ($teller,15); //grote van de afbeelding
$background = imagecolorallocate ($im, 150, 150, 150);  //achtergrondkleur instellen
$text_color = imagecolorallocate ($im, 50, 50, 50); //tekstkleur instellen
imagestring ($im, $font, 0, 0, $tekst,  $text_color); //de image maken//
imagepng ($im);
imagedestroy ($im);
?>

[ Voor 122% gewijzigd door redpen op 30-10-2003 13:50 ]

beter 10 servers in de lucht dan 1 op de grond


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Ja de positie in de string tellen, beginnend bij 0

Ik ben er dan dus wel vanuit gegaan dat deze positie fixed is. Als je dat niet wilt kun je ook de positie weglaten, maar dan is het al goed als er uberhaupt 127.0.0.1 in voorkomt.

Ik ken de variabiliteit in de logfiles zo niet, dus ik kan niet beoordelen wat in jouw geval wel en niet zou werken.

//edit:
grrr ... moet fopen('logfile', 'r') zijn. Die 'r' is voor read only... dom dom dom :-\

De datum is toch 0-padded, oftewel altijd even lang? Anders moet je idd een andere methode kiezen...

[ Voor 28% gewijzigd door Morrar op 30-10-2003 13:54 ]


Acties:
  • 0 Henk 'm!

  • redpen
  • Registratie: Maart 2003
  • Laatst online: 13-08 23:44
edti

het werkt :P


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
header ("Content-type: image/gif");

$log_file = fopen('/hds/schd3/koeproxy/pproxyrc57220031030.log' , "r"); 
while(!feof($log_file)) 
{  $curr_line = fgets($log_file, 4096); 

     if(strpos($curr_line, '127.0.0.1') == 20) { 
        $count++; 
     } 
} 
fclose($log_file); 

$teller=$count; 
$tekst = "$teller ,paketjes"; 
$font = 4; 
$im = imagecreate ($teller,15); //grote van de afbeelding 
$background = imagecolorallocate ($im, 150, 150, 150);  //achtergrondkleur instellen 
$text_color = imagecolorallocate ($im, 50, 50, 50); //tekstkleur instellen 
imagestring ($im, $font, 0, 0, $tekst,  $text_color); //de image maken// 
imagepng ($im); 
imagedestroy ($im); 
?> 


nice thnx :D

nu nog verder ontwikkelen ben bezig met een php stats analyser voor koetje :D

[ Voor 24% gewijzigd door redpen op 30-10-2003 14:00 ]

beter 10 servers in de lucht dan 1 op de grond

Pagina: 1