Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak odczytać z logów
Forum PHP.pl > Forum > PHP
Piotr :)
witam
Dopiero zaczynam poznawać php i stanołem na takim temacie .
Mam plik acces.log z danymi które mnie interesują , jak pbrać z niego numer IP i odwiedzany adres , (niestety dane te nie występują zawsze po tej samej ilości spacji .oto przykład z loga

( 1 wiersz )
1065294793.590 434 192.168.0.2 TCP_MISS/200 351 GET http://216.239.59.104/search? - DIRECT/216.239.59.104 text/htm
(2 wiersz )
1065294793.637 55 192.168.0.2 TCP_MISS/200 1995 GET http://idm.hit.gemius.pl/pp_gemius.js - DIRECT/212.75.96.91

będę wdzięczy za pomoc biggrin.gif
Kocurro
użyj funkcji explode
adwol
Cytat
(niestety dane te nie występują zawsze po tej samej ilości spacji

Dlaczego? Jeśli nie zmieniasz definicji formatu loga to pola są stałe. Potem tylko explode po spacji i gotowe.
Piotr :)
Cytat
(niestety dane te nie występują zawsze po tej samej ilości spacji .oto przykład z loga  

( 1 wiersz )
1065294793.590    434 192.168.0.2 TCP_MISS/200 351 GET http://216.239.59.104/search? - DIRECT/216.239.59.104 text/htm
(2 wiersz )
1065294793.637    55 192.168.0.2 TCP_MISS/200 1995 GET http://idm.hit.gemius.pl/pp_gemius.js - DIRECT/212.75.96.91  
niestety drugi ciąg znaków jest raz 3 cyfrowy a w następnej linijce może być 1 cyfrowy i interesujące mnie dane mam raz po 5 lub po 6 spacjach i nie mam pomysłu jat to zrobić ?;(
adwol
Cytat
niestety drugi ciąg znaków jest raz 3 cyfrowy a w następnej linijce może być 1 cyfrowy i interesujące mnie dane mam raz po 5 lub po 6 spacjach  i nie mam pomysłu jat to zrobić ?;(

Eee... Jeśli $s to jest linijka z logiem to:
[php:1:01c427c051]<?php
$a = preg_split('/ +/', $s);
print $a[2];
?>[/php:1:01c427c051]
wypisze Ci IP klienta.
nobody
Chcesz wyswietlic adres IP i odwiedzany link, ja nie widze problemu zeby skorzystac z explode:
[php:1:910befa703]<?php
$log="1065294793.637 55 192.168.0.2 TCP_MISS/200 1995 GET http://idm.hit.gemius.pl/pp_gemius.js - DIRECT/212.75.96.91";
$tab=explode(" ", $log);
print "IP: $tab[2] LINK: $tab[6]";
?>[/php:1:910befa703]
Piotr :)
niestety panowie opcja ze stałą spacją nie działa explode
Umieściłem plik log
http://tekton.homeip.net/dabek/test/access.log(on pod mc na linuksie jest w bardziej czytelny niż pod notatnikiem smile.gif)
http://tekton.homeip.net/dabek/test/jekie.php a tu jest efekt działania .Może ja czegoś nie widzę ( czeski błąd )
może ktoś mam pomysł

Może wiecie jak zmodyfikowac to co jest zapisywane do loga questionmark.gif?
jest to log od sqida
adwol
Cytat
niestety panowie opcja ze stałą spacją nie działa explode

A dlaczego nie użyłeś preg_split tak jak Ci napisałem parę postów temu? Kto Ci każe explode używać?
Piotr :)
przerobiłem na preg_split i DZIAŁA SUPER . Wcześniej też próbowałem i efekt mialem zupełnie inny , Szczerze mówiac nie znam za fej funcji i nie rozumiem czym różni od explode szukałem w manualu ale za wiele z tej lektóry nie wyniosłem sad.gif ( a na polskich staonach nie znalazłem opisu ) Jeszce raz serdeczne dzięki Jak możesz mi opisac w kilku dzaniach co ona robi będę Dźwięczny ....
adwol
Cytat
Jak możesz mi opisac w kilku dzaniach co ona robi  będę Dźwięczny ....

preg_split i explode robią to samo, tzn. rozbijają string na części, z tą róznicą, że explode jako miejsce rozbicia przyjmuje stały ciąg znaków, a preg_split wyrażenie regularne, które jest bardziej elastyczne od zwykłego stringa.
Piotr :)
poczytałem troche o wyrażeniach regularnych i znowu mam problem może nie wiem jak tego uzywac

mam juz Ip mam juz url lech niewiem jak pozbawić go tego co mi jest nie potrzebne czyli jest link np:

http://www.google.com.pl/search?
a ja chce http://www.google.com.pl (samo odwołanie do domeny !)
[php:1:2b2d602395]<?
$plik = fopen ("/wwwcache/logs/access.log", "r"); // skąd ma pobierać
while (!(feof($plik))) {
$wiersz = fgets ($plik, 200);
$zmienne= preg_split('/ +/', $wiersz); //dzięki adwol ! ?> [/php:1:2b2d602395]

i tu wymyśliłem sobie coś takiego co niestety nie dział ;( a wydaje mi sie ze powinno)
[php:1:2b2d602395]<?
$link = ereg ('^http://*[.]/$', $zmienne[6], $url )

print "$url[1];

?>[/php:1:2b2d602395]
jeżeli ktos wie o co chodzi niech mi napisze ( może być łopatologicznie winksmiley.jpg)
dzięki
nobody
Moze zrob tak:
[php:1:5d5a6384f3]<?php
$url="http://www.google.com.pl/search?";
$url=parse_url($url);
print $url['scheme']."://".$url['host'];
?>[/php:1:5d5a6384f3]
Pozdro.
adwol
Cytat
jeżeli ktos wie o co chodzi niech mi napisze ( może być łopatologicznie winksmiley.jpg)
dzięki

Staraj się uzywać zamiast ereg-a funkcji preg_*. Są szybsze i mają większe możliwości.
[php:1:ad9ba4f94a]<?php
$link = preg_replace('|^(http://[^/]*?)/.*$|', '1', $url);
?>[/php:1:ad9ba4f94a]
Piotr :)
jeżeli dobrze rozumiem kod ( załerzy mi aby wiedzieć co pisze smile.gif)
to
$link = preg_replace('|^(http://[^/]*?)/.*$|', '1', $url);

preg_replace ( zamień istniejace ( podobno ten przedrostek preg to z perla questionmark.gif?) ( niewiem po co ten pierwszy znacznik | ) wszystkie zaczynające sie od http:// [nie zawierające /] dowolny znak lub zero ) tutaj znowu nie wiem po co to jest /. i kończący sie dowolnym zankiem , tego po przecinku tez nie wiem po co jest ( tu chba ma byc z jakiego ciągu ) I $URL TO WIEM .JEŻELI MOGE PROSIC O WYJAŚNIENIE TEGO
adwol
Cytat
podobno ten przedrostek preg to z perla questionmark.gif?)

Nie podobno, a napewno. :wink:
Cytat
JEŻELI MOGE PROSIC O WYJAŚNIENIE TEGO

Znaki | na początku i końcu wyrażenia ograniczają je i poza tym nic nie znaczą. Mogą to być dowolne dwa takie same znaki. Najczęściej wybiera się taki znak, który nie występuje w samym wyrażeniu aby nie trzeba było niepotrzebnie eskejpować.
Znak ^ oznacza, że dopasowywanie musi być zaczęte od początku stringa.
Wyrażenie w nawiasie (http://[^/]*?) pasuje do ciągu zaczynającego się od http://, po którym występuje dowolnie długi (również pusty) ciąg znaków różnych od / (wyrażenie [^/]*?). Przy czym dopasowanie będzie niezachłanne (znak ?), tzn. dopasowany będzie najkrótszy ciąg spełniający warunki.
Znak / za nawiasem oznacza samego siebie czyli wystąpienie slasha w URLu (będzie to slash oddzielający nazwę hosta od ścieżki do pliku ponieważ poprzednie dopasowywanie było niezachłanne).
.* dopasowuje dowolny ciąg znaków (również pusty) zachłannie, tzn. dopasowany będzie najdłuższy ciąg spełniający warunki.
Znak $ na końcu oznacza że dopasowywany ciąg ma być do końca stringa.

Funkcja preg_replace służy do zamiany dopasowanego fragmentu łańcucha na inny. Ponieważ użyliśmy znaczników ^ i $ które dowiązują dopasowywany łańcuch odpowiednio do początku i końca podanego stringa, całość zostanie dopasowana, a więc też i całość zostanie zamieniona.
To na co zostanie zamieniony dopasowany fragment określa drugi parametr preg_replace. Wartość 1, obecna w tym przypadku, mówi, że należy wstawić to co się dopasowało w pierwszych (w tym wypadku jedynych) nawiasach wyrażenia (po to były w tym wyrażeniu nawiasy).
W konsekwencji zawartość całego stringa $url jest zamieniana na jego początkowy fragment od http:// aż do następnego znaku / wyłącznie.

Myślę, że wytłumaczyłem jasno i przejrzyście i zrozumiałeś o co chodzi. :wink:
Piotr :)
cos nie działa , juz próbowałem [php:1:fffc382455]<?php
$url="http://www.google.com.pl/search?";
$link = preg_replace('|^(http://[^/]*?)/.*$|', $url, $dobrylink);
print "$dobrylink ";
?>[/php:1:fffc382455]

i też nie działa nawet z ereg w prostej formie ^http dowolny ciąg znaków i mam puste miejsce nie zwtaca ani odrobiny ciągu ,
niewiem co jest grane
questionmark.gifquestionmark.gif
ten przykład od nobody wysypije mi się , powoli zaczynam sie martwić rolleyes.gif
Piotr :)
wytłumaczone jest super jeszcze tak dokładnego opisu nie znalazłem Wielkie dzięki za chęci przekazania swojej wiedzy .
Musze to jeszcze przetrawić
adwol
Cytat
cos nie działa

Eeeeh... Widzę, że jednak mimo moich usilnych starań nie zrozumiałeś:
[php:1:326baa8ef8]<?php
$url = "http://www.google.com.pl/search?";
$link = preg_replace('|^(http://[^/]*?)/.*$|', '1', $url);
print "$linkn";
?>[/php:1:326baa8ef8]
preg_replace ma inną składnię niż ereg. Nie mieszaj tych dwóch funkcji.
Piotr :)
MOJA WINA MOJA WINA MOJA WINA :oops:
jAK NAPISAŁEŚ PRINT $LINK AŻ ZASTYGŁEM
TO JA KOMBINUJĘ CO MAM ŻLE W SKŁADNI CZY ^ CZY NAWIAS NIE ZAMKNIETY ......! a tu okazuje ze ................. jeszce raz dzięki
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.