Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]zliczanie ilości błedów
webmaniak
post
Post #1





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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?

Ten post edytował webmaniak 10.05.2013, 14:37:26


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 18)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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ł?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
webmaniak
post
Post #3





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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:)?


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
ber32
post
Post #4





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


  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. }


Ten post edytował ber32 10.05.2013, 15:36:37


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
webmaniak
post
Post #6





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
ber32
post
Post #7





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Podaj przykład takiego loga
może preg_match, a potem explode()


--------------------
Go to the top of the page
+Quote Post
webmaniak
post
Post #8





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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?

Ten post edytował webmaniak 10.05.2013, 20:06:49


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
ber32
post
Post #9





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


To co pisałem wcześniej i do tego $d = date("20:20:33"); i możesz sprawdzać. no i jakiś for(){}


--------------------
Go to the top of the page
+Quote Post
webmaniak
post
Post #10





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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:)?


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
ber32
post
Post #11





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


może cron


--------------------
Go to the top of the page
+Quote Post
webmaniak
post
Post #12





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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ć.

Ten post edytował webmaniak 10.05.2013, 20:49:20


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
ber32
post
Post #13





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Jaki masz dostęp do pliku z logami


--------------------
Go to the top of the page
+Quote Post
webmaniak
post
Post #14





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


W aplikacji? Pełny.


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
ber32
post
Post #15





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Podepnij plik sprawdzający pod stronę i możesz sprawdzać po każdym ("logowaniu")


--------------------
Go to the top of the page
+Quote Post
webmaniak
post
Post #16





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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?


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
session
post
Post #18





Grupa: Zarejestrowani
Postów: 112
Pomógł: 22
Dołączył: 11.04.2010
Skąd: Tarnów

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


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





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


wow, dzięki wielkie! Na pewno się przyda smile.gif


--------------------
Pomogłem - kliknij , wprowadziłem w błąd - poinformuj niżej lub na pm.
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 Aktualny czas: 20.08.2025 - 09:02