Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Interpretacj logów - jak ?
kiler129
post 3.06.2007, 12:53:16
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ą tiredsmiley.gif

Drugi problem to taki jak wyciagnac rozdzielczosc ?


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
dr_bonzo
post 3.06.2007, 13:13:12
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


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
kiler129
post 3.06.2007, 13:28:40
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 ?


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
abc667
post 3.06.2007, 13:31:18
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 3.06.2007, 13:51:37
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. ?>


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Kamson
post 3.06.2007, 18:58:27
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 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 3.06.2007, 23:58:45
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 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

Ten post edytował kiler129 4.06.2007, 00:10:01


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Kamson
post 4.06.2007, 08:38:37
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 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 4.06.2007, 15:05:51
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 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

Ten post edytował kiler129 4.06.2007, 15:08:20


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Kamson
post 4.06.2007, 16:17:02
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. winksmiley.jpg

Ten post edytował Kamson 4.06.2007, 16:21:54
Go to the top of the page
+Quote Post
kiler129
post 4.06.2007, 16:42:06
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 Rkingsmiley.png

Ten post edytował kiler129 4.06.2007, 16:53:35


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Kamson
post 4.06.2007, 17:21:07
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 4.06.2007, 19:07:50
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 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

Ten post edytował kiler129 6.06.2007, 01:24:41


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 16.06.2025 - 21:04