Gå til innhold

Stoppe unödvendig informasjon i en loggfil


Anbefalte innlegg

Jeg har en webside som jeg logger treffene på. Jeg bruker PHP og skriver til en txt fil. I denne loggen logges dato, ip, hvor brukeren kom fra og hvilken nettleser som brukes.

 

Mange av oppföringene i denne loggen er sökeroboter som f. eks: msnbot. Det jeg vil gjöre er å hindre at slike oppföringer kommer i denne loggen. Det jeg da pröver på er å bruke if og else for å hindre skriving av disse oppföringene. Men jeg klarer ikke å stoppe dem og skjönner ikke hvorfor...

 

Her er nödvending info, slik logges ALT:

$dinip="$_SERVER[REMOTE_ADDR]";

$komfra="$_SERVER[HTTP_REFERER]";

$system="$_SERVER[HTTP_USER_AGENT]";

$dato=date("Y-m-d - H:i");

 

$loggfil = fopen('/var/www/html/logg.txt', 'a');

$innhold = "$dato\n $dinip\n "$komfra\n $system";

fwrite($loggfil, $innhold);

fclose($loggfil);

 

Dette pröver jeg å gjöre for å stoppe noen oppföringer i loggen (eks. msnbot):

if($system == "msnbot/0.3 (+http://search.msn.com/msnbot.htm)")

{

}

else

{

fwrite($loggfil, $innhold);

fclose($loggfil);

}

 

Dette stopper ikke oppföringen fra å komme i loggen. Men om jeg pröver

if($dinip == "203.24.256.24)"

{

}

 

istedenfor så stopper den oppföringen i loggen hvis brukeren har den ip-adressen. Hvorfor virker ikke dette med $system? Og er det mulig å bruke wildcards på noe vis? Eks.

if($system == "msnbot*")

{

}

 

Og til alle som har veldig lyst til å si det: Ja, jeg vet om SQL, men er litt n00b på dette området og önsker å starte i det små. Håper noen kan hjelpe meg, takk på forhånd.

Lenke til kommentar
Videoannonse
Annonse

Nå her jeg funnet noe som virker slik jeg önsker:

$needle = "msnbot";

$haystack = " ".$system ;

if (strpos($haystack, $needle)) {

}

else

{

fwrite($loggfil, $innhold);

fclose($loggfil);

}

 

Er det mulig å sette flere sökeord inni $needle = "msnbot"; ? Eks. (som ikke virker): $needle = "msnbot, Googlebot";

 

Eller MÅ jeg lage noe slikt:

 

$msnbot = "msnbot";

$Googlebot = "Googlebot";

$haystack = " ".$system ;

if (strpos($haystack, $msnbot)) {

}

elseif (strpos($haystack, $Googlebot)) {

}

else

{

fwrite($loggfil, $innhold);

fclose($loggfil);

}

 

Jeg har laget dette og det ser ut til å virke, men finnes det mulighet for å bare ha en "if", og heller ha med flere sökeord i "needle" så gjör jeg gjerne det.

Lenke til kommentar

$needles = array("msnbot", "google");

$haystack = " ".$system ;

$i = "0";

 

while ($i < sizeof($needles)) {

 

if (strpos($haystack, $needle)) {

}

else

{

fwrite($loggfil, $innhold);

fclose($loggfil);

}

 

}

 

 

ser kanskje ut som mer kode nå, men om du tar flere søkemotorer enn 2 , vil du se at det slettes ikke er tilfelle.

Endret av robgar
Lenke til kommentar

robgar: det var akkurat noe sånt jeg var på utkikk etter, takk!

 

Men, når jeg bruker det, så kommer websiden fram som dette:

Warning: fwrite(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 52

 

Warning: fclose(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 53

 

Warning: fwrite(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 52

 

Warning: fclose(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 53

 

Warning: fwrite(): 2 is not a valid stream resource in /var/www/html/css/topp.php on line 52

 

OSV

OSV

OSV (i det uendelige)

 

Leter etter feil, men finner ikke, kan du se over koden din og sjekke om den stemmer? Eller er det feil hos meg en plass?

Lenke til kommentar

:blush: Du stenger den for hver gang i loopen og åpner den bare en gang.

Du må ha åpning av fil og stenging av fil for hver gang om det skal gå.

 

MEN : Det er lurere å ta fopen() før loopen og fclose() etter loopen, da den da slipper å jobbe masse unødvendig.

 

$needles = array("msnbot", "google");

$haystack = " ".$system ;

$i = "0";

$loggfil = fopen("loggfil.txt", "a+"); // før løkke og if test

 

while ($i < sizeof($needles)) {

 

if (strpos($haystack, $needle)) {

}

else

{

fwrite($loggfil, $innhold); // legg merke til at det bare er fwrite.

}

 

}

 

fclose($loggfil); // etter løkke og if test

 

 

EDIT Så jeg glemte $loggfil og puttet fclose i loopen

Endret av robgar
Lenke til kommentar

Ok, dette gikk virkelig ikke!

 

Det som skjer nå er at siden aldri lastes (står sikker og skriver som en gal til txt fila). Og at txt fila blir så stor som det er ledig plass på webserveren (250 MB!).

while ($i < sizeof($needles)) {

 

if (strpos($haystack, $needle)) {

}

Er dette en glipp eller snakker vi om $needles og $needle, det eneste som er blitt definert er jo $needles

 

Dette går litt over mitt hode, så jeg er avhengig av deg/dere for å finne feil i koden.

Lenke til kommentar

Ops :blush: Glemte å legge til i++; i løkka.

 

$needles = array("msnbot", "google");

$system="$_SERVER[HTTP_USER_AGENT]";

$haystack = " ".$system ;

$i = "0";

$loggfil = fopen("loggfil.txt", "a+");

 

if ($stopp !== true) {

 

while ($i < sizeof($needles)) {

 

if (!strpos($haystack, $needles[$i])) {

 

fwrite($loggfil, $innhold);

$stopp = true;

}

$i++;

}

}

fclose($loggfil);

 

EDIT : Fikset på koden (Virker ikke ^)

 

EDIT 2 : Nei , om den ikke er msnbot, så vil stopp være true selv om det er google som lusker. Dette her vil virke;

 

<?

 

$needles = array("msnbot", "google", "kvasir");

$system="$_SERVER[HTTP_USER_AGENT]";

$haystack = " ".$system ;

$i = "0";

$loggfil = fopen("loggfil.txt", "a+");

 

while ($i < sizeof($needles)) {

 

  if (strpos($haystack, $needles[$i])) {

  $robot = true; 

}

}

 

if ($robot !== true){

  fwrite($loggfil, $innhold);

}

 

fclose($loggfil);

?>

 

Hvet ikke om Kvasir er en søkerobot men men.

Endret av robgar
Lenke til kommentar

Der begynner det vel å nærme seg, nå virket siden nesten med engang, det eneste som mangla var $ forran i++;. Men selv om siden nå kommer som den skal så stopper dette ikke noen oppføringer i loggen, derimot skriver den alt tre (3) ganger.

Lenke til kommentar

Sant det, men kunne hende det ikke skjedde hvis det lå i en include(); jeg har ikke testa det, så jeg bare tok noe som var nesten litt logisk :p

 

Når jeg tenker meg litt mer om så husker jeg faktiskt at jeg hadde feil :p

Endret av LoS
Lenke til kommentar

Jeg forandret koden nå, :

 

<?

 

$needles = array("msnbot", "google", "kvasir");

$system="$_SERVER[HTTP_USER_AGENT]";

$haystack = " ".$system ;

$i = "0";

$loggfil = fopen("loggfil.txt", "a+");

 

while ($i < sizeof($needles)) {

 

  if (strpos($haystack, $needles[$i])) {

  $robot = true; 

}

$i++;

}

 

if ($robot !== true){

  fwrite($loggfil, $innhold);

}

 

fclose($loggfil);

?>

 

Forklaring:

 

Loopen går igjenom klienten, og om det er en av de nevnte i arrayet over er $robot = true;

 

Om $robot ikke er true, så skriver den til fila.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...