Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Interpretacj logów - jak ?
kiler129
post
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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ą (IMG:http://forum.php.pl/style_emoticons/default/tiredsmiley.gif)

Drugi problem to taki jak wyciagnac rozdzielczosc ?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
kiler129
post
Post #3





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
abc667
post
Post #4





Grupa: Zarejestrowani
Postów: 229
Pomógł: 0
Dołączył: 29.05.2007

Ostrzeżenie: (0%)
-----


możesz posortować tablicę poprzez sort() a następnie wyświetl te z indeksami 0-9
Go to the top of the page
+Quote Post
kiler129
post
Post #5





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Kamson
post
Post #6





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 23.10.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

można uprościć wywalając list() i ten warunek limitujący do 10 wyświetleń

Ten post edytował Kamson 3.06.2007, 19:01:21
Go to the top of the page
+Quote Post
kiler129
post
Post #7





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Jakos nie za duzo rozumiem z tego kodu (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Zostanie on opublikowany zapewne jako wersja 2.0, obecna to 1.3 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował kiler129 4.06.2007, 00:10:01
Go to the top of the page
+Quote Post
Kamson
post
Post #8





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 23.10.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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..

Ten post edytował Kamson 4.06.2007, 08:40:58
Go to the top of the page
+Quote Post
kiler129
post
Post #9





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Kurde tylko jest maly problem - zaczyna sie coraz to dluzej wykonywac :/

Tak czy siak uzyje twoj skrypt (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Moglbys podkomentowac linie zebym sie bardziej lapal ?

p.s. Czy dalo by sie przerobic foreach na while ? Jakos nie zabardzo rozumiem foreach (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował kiler129 4.06.2007, 15:08:20
Go to the top of the page
+Quote Post
Kamson
post
Post #10





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 23.10.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  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. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Kamson 4.06.2007, 16:21:54
Go to the top of the page
+Quote Post
kiler129
post
Post #11





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png)

Ten post edytował kiler129 4.06.2007, 16:53:35
Go to the top of the page
+Quote Post
Kamson
post
Post #12





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 23.10.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował Kamson 4.06.2007, 17:26:11
Go to the top of the page
+Quote Post
kiler129
post
Post #13





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Co do optymalizacji to otwieranie pliku, inaczej echo, inaczej rozlozone while itp.
Gdybys chcial kod to moge Ci podrzucic (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Tak ogolnie to mam chetke na serwis ze statami (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Napeno znajdziesz sie w podziekowaniach (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

edit: Takie male demko (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) http://idysk.net/stat/stat.php

Ten post edytował kiler129 6.06.2007, 01:24:41
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 20:00