Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Interpretacj logów - jak ?
Forum PHP.pl > Forum > PHP
kiler129
A więc mam logi w takim formacie:

Kod
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refer


I teraz jak np. wyswietlic 10 najczesciej wystepujacych referów lub 10 najpoplarniejszych podstron ?
Z przeglądarką nie ma problemu bo wystarczy liczyc ile razy wystapilo np. Opera i wyliczac jaki to % liczby wszytkich odwiedzin ale tak nie dam rady z referem i podstroną tiredsmiley.gif

Drugi problem to taki jak wyciagnac rozdzielczosc ?
dr_bonzo
Cytat
Drugi problem to taki jak wyciagnac rozdzielczosc ?

Z logow? nie da sie. JSem --> poszukaj na forum, bylo wiele razy

Cytat
I teraz jak np. wyswietlic 10 najczesciej wystepujacych referów lub 10 najpoplarniejszych podstron ?

1. wrzuc do bazy i po problemie
2. wczytaj kazda linie (file()), rozbij na pola (explode()) i wrzucaj do tablicy

$referert[ $ref ] ++

i na koniec policz ktorego jest najwiecej
kiler129
SQL nie wchodzi w gre niestety :/
Z baza było by bajecznie prosto ....

Mozesz wyjaśnić dokłądniej drugi sposób ?

czyli będę miał np.:

$referert[ http://www.test.pl ] ++

I teraz $referert[ http://www.test.pl ] = 1 i teraz jak zliczyc ktorych jest najwiecej ?
abc667
możesz posortować tablicę poprzez sort() a następnie wyświetl te z indeksami 0-9
kiler129
Cos jest nie tak :/

var_dump zwraca mi to:

Kod
array(6) { [" jakis ref
"]=> int(1) [""]=> int(4) [" "]=> int(12) [" http://192.168.0.104/stat/ "]=> int(13) [" "]=> int(16) [" http://192.168.0.104/stat/ "]=> int(9) }


Nie rozumiem tego ;/
2 razy jest np. http://192.168.0.104/stat/ bez sensu :/
HELP !

Kod wygląda tak:

  1. <?php
  2. $plik = file($log_dir.'/access.log');
  3. $ipml = count($plik); 
  4. $i = 0;
  5. while($ipml >= $i)
  6. {
  7. $ref = explode('||', $plik[$i]);
  8. $ref = $ref[5];
  9. $odw[$ref]++;
  10. $i++;
  11. }
  12.  
  13. var_dump($odw);
  14. ?>
Kamson
  1. <?php
  2.  
  3. $log = file_get_contents('log.log');
  4. $log = ereg_replace("rn","n",$log);
  5. $linijka = explode("n",$log);
  6.  
  7. foreach($linijka as $wers) {
  8. $kolumna = explode(' || ',$wers);
  9. list($ip,$host,$przegladarka,$data,$url,$ref) = $kolumna;
  10.  
  11. $refer[$ref]++;
  12. }
  13.  
  14. arsort($refer);
  15.  
  16. $i = 0;
  17. $limit = 10;
  18.  
  19. foreach($refer as $adres => $ile) {
  20. if($i<$limit)
  21. $i++;
  22. else
  23. break;
  24.  
  25. print $adres.' ('.$ile.') ('.ceil(($ile/count($linijka))*100).'%)<br />';
  26. }
  27. ?>


może nie jest zbyt piękne ale działa winksmiley.jpg

można uprościć wywalając list() i ten warunek limitujący do 10 wyświetleń
kiler129
Jakos nie za duzo rozumiem z tego kodu tongue.gif
Mam zamiar dodac jeszce geolokalizacje, napisalem juz skrypt do sprawdzania kraju ale znowu problem wraca jak numerang - jak wyswietlic kraje z ktorych wchodzono ?

Potrzebuje tylko zebrac dane o krajach z kazdej linijki i sprawdzic jakie kraje wystapily i ile razy kazdy - ktos cos prostego podrzuci ?

edit:

Siadłem jeszce raz na spokojnie a lapkiem w lozku i przeanalizowalem swoj poprzednio pokazany kod smile.gif
Po malej przerobce wyglada tak:

  1. <?php
  2. $plik = file($log_file);
  3. $ipml = count($plik); 
  4. $i = 0;
  5. while($ipml >= $i)
  6. {
  7. $ref = explode('||', $plik[$i]);
  8. $ref = $ref[0];
  9. $odw[$ref] = $odw[$ref]+1;
  10. $i++;
  11. }
  12. ?>


Działa znakomicie biggrin.gif
Po za jednym szczegolem :/ Skad mam znac nazwy elemtow tablicy :/
Dane chciłbym pokazac w tabeli z 2 kolumnami, kraj i ilosc wizyt z danego kraju smile.gif


p.s. Dostałem juz kilka pw z pytaniem o cały kod - odpowiadam tutaj - nie ma i nie bedzie narazie, jak skoncze to dostaniecie sepy tongue.gif Zostanie on opublikowany zapewne jako wersja 2.0, obecna to 1.3 smile.gif
Kamson
kiler129 sprawdź mój kod .. on podlicza ile razy czego było w każdej linijce ... sortuje wg. liczby wystąpień i wyświetla pierwsze 10 .. do tego obok pokazuje ile % całości to dane wystąpienie winksmiley.jpg

http://k3d.be/ext/log/logi.php

wynik tego kodu dla log.log
Kod
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refer
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refer
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refer
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refe
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refe
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refe
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || refer
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || re
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || re
ip usera || host usera || przegladarka || data godzina || zadany url np. /admin/index.php || re



Ten kod może bez problemu liczyć wystąpienia miast , itd..
kiler129
Kurde tylko jest maly problem - zaczyna sie coraz to dluzej wykonywac :/

Tak czy siak uzyje twoj skrypt smile.gif
Moglbys podkomentowac linie zebym sie bardziej lapal ?

p.s. Czy dalo by sie przerobic foreach na while ? Jakos nie zabardzo rozumiem foreach smile.gif
Kamson
  1. <?php
  2. //$log = file_get_contents('log.log');
  3. //$log = ereg_replace("rn","n",$log);
  4. //$linijka = explode("n",$log);
  5.  
  6. $linijka = file('log.log');
  7.  
  8. foreach($linijka as $wers) {
  9. // dzieli linijke na tablice 
  10. $kolumna = explode(' || ',$wers);
  11. // przypisuje elementy tablicy do zmiennych (mozna to wywalić ale musisz wstawiac wtedy $kolumna[0] zamiast $ip itd..) 
  12. list($ip,$host,$przegladarka,$data,$url,$ref) = $kolumna;
  13.  
  14. $stat['ip'][$ip]++;
  15. $stat['host'][$host]++;
  16. $stat['przegladarka'][$przegladarka]++;
  17. $stat['url'][$url]++;
  18. $stat['ref'][$ref]++;
  19. }
  20.  
  21. // funkcja wyświetlająca statystyki konkretnego pola
  22. function showStat($pole,$limit = 10) {
  23. global $stat,$linijka;
  24.  
  25. // sortuje tablice
  26. arsort($stat[$pole]);
  27. // mieli tablice wyciągając klucz ($adres) i wartość ($ile)
  28. foreach($stat[$pole] as $adres => $ile) {
  29. // warunek wprowadzający limit ilości wyświetlanych pozycji (można to wywalić) 
  30. if($i<$limit)
  31. $i++;
  32. else
  33. break;
  34. // wyświetla wynik a przy okazji liczy procentowy udział całości
  35. print $adres.' ('.$ile.') ('.ceil(($ile/count($linijka))*100).'%)<br />';
  36. }
  37. }
  38.  
  39. // w tym miejscu wyświetli wynik!
  40. showStat('ref');
  41. ?>


myślę że foreach to dobre rozwiązanie .. żeby wyciągnąć klucz i wartość musiał bym dać pętle for i funkcje each żeby przemieszczać wskaźnik tablicy. while odpada bo to tablica asocjacyjna i nie ma liczb w kluczach

jeśli chodzi o szybkość to wiadomo ...log długi i zaczyna się problem.
Ja bym to zrobił tak że generowaną tablice $stat zapisywał bym sobie do pliku a przemielony log.log czyścił. Skrypt przy ponownym uruchomieniu wczytywał by sobie tablice i mielił by tylko to co w log.log dodane zostało między uruchomieniami skryptu. winksmiley.jpg
kiler129
Kurde nadal sie nie moge polapac co i jak :/
Powiedz mi co gdzie zmienic aby to wpakowac a tabelke (<td></td>) ?
Ew. zrobic wykres poziomy w tej tabeli itp

EDIT: Zoptymalizowałem skrypt i teraz statystyka generuje sie w 0.07 sec Rkingsmiley.png
Kamson
jeśli 100% to ma być 100px

  1. <?php
  2. $procent = ceil(($ile/count($linijka))*100);
  3. print '<table><tr><td style="width:200px;text-align:right;">'.$adres.' ('.$ile.')</td><td style="width:'.($procent*2).'px;background-color:red;">'.$procent.'%</td></tr></table>';
  4. ?>


a mogę wiedzieć co zoptymalizowałeś? .. co byś nie modyfikował to logi po tygodniu funkcjonowania strony i tak jest zbyt obfity do takich analiz ;P
kiler129
Jak beda logi za duze to pobawie sie w cachowanie, tzn. rerenderign na zyczenie, tzn. bedzie user klikal i dostanie mail ze juz sie odswiezyla i ze jest aktualna a tak to bedzie z cache na serwie pochodziła smile.gif

Co do optymalizacji to otwieranie pliku, inaczej echo, inaczej rozlozone while itp.
Gdybys chcial kod to moge Ci podrzucic smile.gif

Tak ogolnie to mam chetke na serwis ze statami smile.gif Napeno znajdziesz sie w podziekowaniach smile.gif

edit: Takie male demko smile.gif http://idysk.net/stat/stat.php
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.