Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]zliczanie ilości błedów
Forum PHP.pl > Forum > Przedszkole
webmaniak
Witam,
mam pewną stronkę, wszelkie błedy zapisuję do logów. Zastanawia mnie teraz w jaki sposób mógłbym zliczać ile razy wystąpił dany błąd, np. błędne logowanie(to tylko przykład) i jeśli ilość tych błedów jest wyższa niż ustale w jakimś configu to wtedy pojawi się stosowna informacja. Zastanawiam się o zliczaniu do bazy danych, ale szukam najlepszego sposobu(mój pomysł to przy zapisie preg_match i zapis do bazy) aby pobrać z loga informację że takie błąd wystąpił, a jesli tak to zapis do bazy - albo w inne miejsce. Jakieś pomysły/lepsze rozwiązanie?
nospor
Nie bardzo rozumiem... najpierw bledy cchesz zapisywać do logów, a potem z tych logów brać i zapisywać do bazy..... hmm..... to czemu od razu do bazy nie będziesz zapisywał?
webmaniak
Do bazy chce zapisywać ile razy wystąpił dany błąd. Przykład:
-chcesz się zalogować, ale wpisujesz błędne dane. za każdym razem idzie zapis do loga. Chce co jakiś czas - albo na bieżąco, zależnie jak będzie prościej, zapisać do bazy liczbę tych błednych logowań-nie tylko jednego usera, lecz większej ilości. Jeśli liczba tych błędnych logowań wyniesie np. 100/na dzień to mam jakiś tam komunikat w panelu administratora.
Rozjaśniłem trochę, wiesz już o co mi chodzi:)?
ber32
  1.  
  2. if(zalogowany)
  3. {
  4. zalogowany
  5. }else{
  6. błąd logowania
  7. zapis da bazy lub pliku
  8.  
  9. $błąd_logowania ="b_logowania";
  10. }
  11.  
  12. $count = select count(blad) from blad WHERE b_logowania=b_logowania;
  13.  
  14. if($count > 5)
  15. {
  16. Popełniłeś piątą pomyłkę logowania
  17. }
nospor
Cytat(webmaniak @ 10.05.2013, 15:59:15 ) *
Do bazy chce zapisywać ile razy wystąpił dany błąd. Przykład:
-chcesz się zalogować, ale wpisujesz błędne dane. za każdym razem idzie zapis do loga. Chce co jakiś czas - albo na bieżąco, zależnie jak będzie prościej, zapisać do bazy liczbę tych błednych logowań-nie tylko jednego usera, lecz większej ilości. Jeśli liczba tych błędnych logowań wyniesie np. 100/na dzień to mam jakiś tam komunikat w panelu administratora.
Rozjaśniłem trochę, wiesz już o co mi chodzi:)?

No dobrze, ale czemu nie możesz od razu tej informacji zapisywać w bazie? tego nie rozumiem....

Ja u siebie w bazie loguje wszystko co się da: logowanie, bledne logowanie, edycja danych, kasowanie danych itp. Dzieki temu mam wszystko ładnie napisane kto gdzie kiedy. bez problemu moge sobie filtrowac po czym chce i wszystko widac jak na dloni.
A zeby te logi mi nie póchły to raz na 3 miesiace czyszcze stare wpisy bo one już do niczego nie są mi potrzebne
webmaniak
Cytat(ber32 @ 10.05.2013, 16:35:29 ) *
  1.  
  2. if(zalogowany)
  3. {
  4. zalogowany
  5. }else{
  6. błąd logowania
  7. zapis da bazy lub pliku
  8.  
  9. $błąd_logowania ="b_logowania";
  10. }
  11.  
  12. $count = select count(blad) from blad WHERE b_logowania=b_logowania;
  13.  
  14. if($count > 5)
  15. {
  16. Popełniłeś piątą pomyłkę logowania
  17. }

Dzięki kolego za próbę pomocy, ale to nie jest chyba odpowiedź na moje pytanie(patrz niżej)
Cytat(nospor @ 10.05.2013, 17:38:57 ) *
No dobrze, ale czemu nie możesz od razu tej informacji zapisywać w bazie? tego nie rozumiem....

Ja u siebie w bazie loguje wszystko co się da: logowanie, bledne logowanie, edycja danych, kasowanie danych itp. Dzieki temu mam wszystko ładnie napisane kto gdzie kiedy. bez problemu moge sobie filtrowac po czym chce i wszystko widac jak na dloni.
A zeby te logi mi nie póchły to raz na 3 miesiace czyszcze stare wpisy bo one już do niczego nie są mi potrzebne

Hmmm.... Czemu, to jest dobre pytanie, ale mając kilkadziesiąt tabel po prostu przy projektowaniu podjąłem decyzję o zapisie logów do pliku.

Problem polega na tym że te błędy są otrzymywane z webservicu. @ber32 tak jak pisałem logowanie to tylko był przykład, ale chyba niefortunny smile.gif W każym razie webservice może zwrócić różne odpowiedzi. Ja chce tylko jeden przypadek zliczać i jeśli będzie tych błędów za dużo to dać jakąś informację, że jest problem z serwisem, coś w tym stylu. I tak jak pisałem pobierając odpowiedź mogę ją przefiltrować preg_match i zapisywać do bazy. Tylko pozostaje problem zliczania, kiedy to zliczyć. Szukam po prostu najlepszego rozwiązania, dlatego czekam na sugestię(mam nadzieję że teraz lepiej wytłumaczyłem smile.gif ) i z góry dziękuję smile.gif
ber32
Podaj przykład takiego loga
może preg_match, a potem explode()
webmaniak
Nie mam w tej chwili dostępu do pełnego loga, ale chodzi generalnie o taki błąd:
  1. ERROR - 2013-05-10 20:20:33 --> plik: cURL error 28: Operation timed out after 10000 milliseconds with 0 bytes received dalej jakieś następne dane

Generalnie chodzi o zliczenie tego błędu. Teraz tak patrzę że jest taka metoda jak curl_errn, która dzięki niej mógłbym chyba sprawdzić czy błąd jest taki co sprawdzam, jeśli tak to zliczać, dobrze myślę? Tylko w jaki najlepszy sposób sprawdzać czy np jest 20 takich błędów w ciągu np. 5 minut?
ber32
To co pisałem wcześniej i do tego $d = date("20:20:33"); i możesz sprawdzać. no i jakiś for(){}
webmaniak
No dobrze, ale pewnie trzeba by też dodać kod któy by sprawdzał w jakim czasie występują te błędy. Sprawa wygląda bowiem tak, że 20błędów na minutę to nie to samo co na dobę smile.gif - wiem że o tym wiecie, ale "głośno" myślę. Więc jak mógłbym sprawdzać w jakim czasie pojawiły się te błędy? bo to date sprawdzi mi o określonej godzinie, ale co jeśli o 20 będzie problem:)?
ber32
może cron
webmaniak
Ok, cron to jedna opcja, jest jakaś inna? Bo jeśli chodzi o cron to jest to dla mnie raczej nowość smile.gif no ale kiedyś trzeba się nauczyć z tego korzystać.
ber32
Jaki masz dostęp do pliku z logami
webmaniak
W aplikacji? Pełny.
ber32
Podepnij plik sprawdzający pod stronę i możesz sprawdzać po każdym ("logowaniu")
webmaniak
Mógłbyś nieco bardziej rozwinąć stwierdzenie podepnij plik sprawdzający pod stronę? Spradzanie odbywa się w pliku, w metodzie która jest podpięta pod stronę, za każdym razem jest właśnie sprawdzane co dostaję w odpowiedzi, tylko nie zliczane. Jeśli będę zliczał po każdym otrzymaniu złej odpowiedzi to czy to się nie odbije na wydajności, jeśli będzie tych odpowiedzi ileś tam setek(nie mówię że tyle jest, ale chodzi mi o optymalne rozwiązanie do wielu sytuacji smile.gif )? Mówimy oczywiście cały czas o zapisie do bazy i sprawdzaniu z niej?
nospor
Zapisuj logi w bazie jak ci mowilem.
W kodzie dodatkowo dodaj kod, który gdy wystapi twoj blad, poleci do bazy i sprawdzi ile w ciagu ostatnich 5 minut bylo tych bledow. Jak było za duzo, to robisż odpowiedni wpis gdzie ci się zywnie podoba.

Tu naprawdę nie ma żadnej filozofii
session
Jeśli koniecznie chcesz na plikach tekstowych to zobacz na specjalnie zrobiony przeze mnie kod:
  1. <?php
  2. /*--- Session Code ---*/
  3. // Definiowanie zmiennych
  4. $error=false;
  5. $ftype=0;
  6. $fatal=false;
  7. // Zapisywanie do pliku
  8. function errorlogS($ftype,$etype){
  9. $fd=fopen('log.info','r+');
  10. $now=time();
  11. $str=$ftype.'|'.$etype.'|'.$now.PHP_EOL;
  12. fwrite($fd,$str.file_get_contents('log.info'));
  13. fclose($fd);
  14. }
  15. // Ilość określonych błędów w określonym czasie
  16. function errorlogWT($ftype,$etype,$min=5){
  17. $count=0;
  18. $fd=fopen('log.info','r');
  19. while(!feof($fd)){
  20. $cnt=fgets($fd);
  21. if($cnt!=""){
  22. $tab=explode('|',$cnt);
  23. $date=time()-($min*60);
  24. if($tab[2]>$date){
  25. if($tab[0]==$ftype&&$tab[1]==$etype){
  26. $count++;
  27. }
  28. }else{break;}
  29. }
  30. }
  31. fclose($fd);
  32. return $count;
  33. }
  34. // Przykład na cURL
  35. $ch=curl_init();
  36. /*---- jakiś kod ----*/
  37. $er_type=curl_errno($ch); // Sprawdzenie wystąpienia błędu
  38.  
  39. if($er_type!=0){$error=true; $ftype=1; if(errorlogWT($ftype,$er_type)>20){$fatal=true;}
  40.  
  41. // Tutaj mogą być kolejne warunki sprawdzające czy wystąpił błąd, zmieniające wartości zmiennych
  42.  
  43. if($error){ // Start zapisu
  44. errorlogS($ftype,$er_type);
  45. }
  46. if($fatal){echo 'Czegoś nie przemyślałem i działa źle wywalając ciągłe błędy :(';}}
  47. ?>


Dodatkowo koniecznie trzeba utworzyć plik log.info. Jeśli ktoś nie wie jak to zrobić na szybko mała instrukcja smile.gif:
Otwieramy Notatnik (notepad.exe)
Klikamy Plik -> Zapisz jako...
W polu Nazwa pliku: wpisujemy log.info
W polu Zapisz jako typ: wybieramy Wszystkie pliki (*.*)
Klikamy przycisk Zapisz

Tak, wiem że dla większości to żadna nowość. Ważne, jednak, aby ten plik znajdował się w tym samym katalogu na serwerze co plik wykonujący funkcje. W innym wypadku należy zmienić ścieżki dostępu do pliku log.info.

Bardzo ważne jest to, że zapis w plikach tekstowych jest mało bezpieczny i łatwo może dojść do wycieku danych. W celu zapewnienia minimum podstawowego bezpieczeństwa należy ustawić odmowę dostępu do pliku log.info w pliku .htaccess, lub zmienić CHMODy tego pliku (serwery Linuxowe).

I mały bonus:
  1. function clearlog(){
  2. $str="";
  3. $fd=fopen('log.info','r+');
  4. while(!feof($fd)){
  5. $cnt=fgets($fd);
  6. if($cnt!=""){
  7. $tab=explode('|',$cnt);
  8. $date=time()-(30*24*60*60); // 30 dni
  9. if($tab[2]>$date){
  10. $str.=$cnt;
  11. }
  12. }
  13. }
  14. fwrite($fd,$str);
  15. fclose($fd);
  16. }
Funkcja usuwająca wpisy starsze niż 30 dni. Należy ją uruchomić w CRONie lub co jakiś czas np. za pomocą palenu admina.

Skrypt nie jest optymalny dla bardzo dużych serwisów.
webmaniak
wow, dzięki wielkie! Na pewno się przyda smile.gif
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.