Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [LR] Produkcja i błędy
Forum PHP.pl > Forum > PHP > Frameworki
markonix
Laravel respektuje proste
error_reporting(0);
ini_set('display_errors', 0);
i chyba najlepszą opcją jest wrzucenie tego w App providera? Oczywiście z warunkiem, że tylko dla produkcji.
Tylko kiedyś nadejdzie taki moment, że będę miał za dużo czasu baaasmiley.gif i przejże sobie logi na produkcji aby ponaprawiać wszystkie notice'y które się tam pojawiły. Tylko powyższe wyłącza błędy całkowicie.
No i tu mam problem - jak zachować logowanie błędów (póki co w pliku, ale w przyszłości coś ambitniejszego), ale zarazem zezwolić na wykonanie skryptu do końca gdy wywali error o niskiej szkodliwości?
Pyton_000
APP_DEBUG = false ppowinno załatwiać sprawę.

PS. Pamiętam wink.gif
markonix
APP_DEBUG oczywiście nie załatwia sprawy bo to by było zbyt trywialne.
Ta zmienna determinuje wyłącznie format zwracanych błędów - przy true zwraca informacje o błędzie do debugowania, a przy false zwraca tylko widok Oopps.
r4xz
Nie rozumiem jaki jest w tym problem, wręcz powiedziałbym że jest to bardzo dobre zachowanie. Pewnie rozwiązanie swojego problemu znajdziesz w dokumentacji, w szczególności w sekcji "Errors & Logging".
markonix
Takie czyli jakie? Nie puszczanie na produkcji aplikacji gdy natrafi na "notice error" to dobre zachowanie?

Link, który wysłałeś dotyczy logowania błędów, nie ma związku z problemem który poruszam. Logować chce wszystko.
viking
Notice to też błąd który może doprowadzić do wywalenia się całej aplikacji więc nie powinno go być już na etapie tworzenia kodu.
Pyton_000
Czyli chcesz aby aplikacja działała pomimo że wywali się error?
batman
@markonix
Do logowania błędów na produkcji polecam Bugsnag, Sentry lub coś podobnego. Ja korzystam z tego pierwszego. Jeśli lubisz bawić się w zaawansowane raportowanie i monitorowanie, sprawdź Logstash.
markonix
Cytat(viking @ 31.10.2017, 05:55:45 ) *
Notice to też błąd który może doprowadzić do wywalenia się całej aplikacji więc nie powinno go być już na etapie tworzenia kodu.

baaasmiley.gif

Cytat(Pyton_000 @ 31.10.2017, 09:27:42 ) *
Czyli chcesz aby aplikacja działała pomimo że wywali się error?

Tak, notice gdy zabraknie przy wyświetlaniu widoku jakiejś zmiennej nie jest dla mnie wystarczającym powodem aby wyłączać całą stronę.
Nie wiem jak ale w Codeigniter tak właśnie mam, że notice nie blokują strony bo się zdarzają bo mam je w logach, a nie ma bata (a teraz już motywacji bo przepisuje całość) aby wyłapać wszystko.

Cytat(batman @ 31.10.2017, 11:59:46 ) *
@markonix
Do logowania błędów na produkcji polecam Bugsnag, Sentry lub coś podobnego. Ja korzystam z tego pierwszego. Jeśli lubisz bawić się w zaawansowane raportowanie i monitorowanie, sprawdź Logstash.

Logowanie błędów takie bardziej PRO jak najbardziej ale do tego przejdę później, ale na razie rozkminiam etap wcześniej.

Edit:
Popatrzyłem jak to jest w CI zrobione.
  1. ini_set('display_errors', 0);
  2. if (version_compare(PHP_VERSION, '5.3', '>='))
  3. {
  4. error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
  5. }
  6. else
  7. {
  8. error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);

I nie wiem czy tu nie ma odpowiedzi smile.gif
display_errors i error_reporting zawsze myślałem, że to tylko komplementarne ustawienia, ale teraz jak się temu przyjrzałem to są to osobne ustawienia jak same ich nazwy wskazują - wyświetlanie błędów i ogólnego raportowania. To teraz moje pytanie brzmi czy zgapić z CI i wstawić to do Laravel'a czy macie inne sugestie - czy da się kontrolować na poziomie aplikacji. Błędy poważne takie jak błędy bazy danych też bym obsłużył inaczej aniżeli wywalenie "Nie udało się" na całą stronę, wg mnie najbardziej userfrielndy będzie wyłapanie tego, zalogowanie oczywiście, a usera np. wrócić na poprzednią stronę już z flash komunikatem, że operacja się nie powiodła itp.
memory
Pytasz się o zgodę czy o rozwiązanie ? Bo jak o zgodę to nie. Laravel łapie wszystkie błędy więc pozostaje ci samemu je obsłużyć.
Pyton_000
Tylko że Laravel rejestruje własne exceptionHandlers i jak już złapie error to nie wypuści go i jedynine co możesz zrobić to obsłużyć go i ew. przekierować go gdzieś lub wyrenderować własny widok.
markonix
Gdyby łapał, a następnie pozwolił mi wybrać odpowiednie akcje było by ok (np. na podstawie ENVIRONMENT podejmowałbym odpowiednie kroki).
https://laravel.com/docs/5.5/errors#the-exception-handler
Cytat
Sometimes you may need to report an exception but continue handling the current request. The report helper function allows you to quickly report an exception using your exception handler's report method without rendering an error page:

To brzmi obiecująco.
Pyton_000
Ale to jest tylko jak samemu sobie łapiesz wyjątki, wtedy możesz tylko zaraportować.
markonix
Laravel 5.7 i ciągle mam problem aby to dobrze skonfigurować.

Jestem albo w stanie wyłączyć błędy NOTICE całkowicie (brak przerwania skryptu, brak informacji w logach), albo wyświetlić defaultowy błąd na całą stronę (z debugiem albo bez).
Error_report i display_errors próbowałem wszystkie kombinacje.
Pilsener
Cytat(markonix @ 27.10.2017, 21:48:35 ) *
Laravel respektuje proste
error_reporting(0);
ini_set('display_errors', 0);
- po to się używa frameworka, żeby nie majstrować przy ustawieniach PHP i dostosować aplikację do środowiska a nie odwrotnie.

Cytat(markonix @ 27.10.2017, 21:48:35 ) *
No i tu mam problem - jak zachować logowanie błędów (póki co w pliku, ale w przyszłości coś ambitniejszego), ale zarazem zezwolić na wykonanie skryptu do końca gdy wywali error o niskiej szkodliwości?
- w każdym lepszym fw jest coś takiego jak logger i error handler - obie te rzeczy zazwyczaj można niezależnie od siebie konfigurować. Standardowe zachowanie to przechwytywanie wszystkich błędów czy notatek i rzucanie zamiast nich wyjątków, następnie ujednolicona obsługa tych wyjątków.

Jest to opisane w dokumentacji Larwy:
https://laravel.com/docs/5.7/errors
Jest też fragment, który szczególnie Ciebie powinien zainteresować:
Cytat
Sometimes you may need to report an exception but continue handling the current request.
markonix
Cytat(Pilsener @ 1.10.2018, 20:13:22 ) *
- po to się używa frameworka, żeby nie majstrować przy ustawieniach PHP i dostosować aplikację do środowiska a nie odwrotnie.

No widzisz, dokładnie tak samo uważam ale 90% wyników na stacku na frazę "ukrywania błędów" na produkcji to wyłączenie tych błędów przed framework'iem przez php, ini czy htaccess.

Cytat(Pilsener @ 1.10.2018, 20:13:22 ) *
Jest też fragment, który szczególnie Ciebie powinien zainteresować:

Jakbyś wzrokowo przejrzał ostatnie moje posty, to sam się do tego fragmentu odniosłem tylko, że ja nie chce nadpisywać handlingu Laravela. Chce aby działało wszystko jak teraz z wyjątkiem nie wywalania się na notice (i może deprecated). Ale spróbuje jeszcze. Dziwie się, że nie znajduje żadnych gotowych rozwiązań bo "stan", które chce osiągnąć wg mnie jest najbardziej prawidłowy na produkcji..


edit:

Próbuje w metodzie render coś zmajstrować ale nie wiem jak w niej zrobić wyjątki.
Problemy jakie mam to wykrycie kategorii Exception (czy to jest notice czy nie). getSeverity() zwraca mi zawsze 1, jedynie to jakoś ma sens:
  1. $exception->getPrevious() instanceof FatalThrowableError)

Dla notice nie jest to fatal.. I może to jest to czego szukam ale ok - wiem już, że nie chce wywalać użytkownikowi strony i przejść dalej więc jak poinstruować o tym FW? Muszę w metodzie render() coś zwrócić, dokładniej to jakiś Response ale jaki?
Pilsener
Na produkcji wyłącza się jedynie wyświetlanie błędów - tak na wszelki wypadek, bo może być np. błąd podczas uruchamiania error handlera smile.gif Jednak tak czy inaczej logi muszą być, całkowite wyłączanie błędów (zwłaszcza fatali) to przegięcie ale znam to i wciąż mam tego typu problemy: biała strona (albo strona błędu) i nic w logach.

Tak czy inaczej musisz napisać kawałek własnego kodu, nadpisać handling Larwy, bo defaultowy jest do bani. Larwa używa Whoopsa, który jest świetnym tego typu komponentem, ale ma tą brzydką wadę, że nie puszcza niczego do logów jeśli jest włączony - dlatego najlepiej zarejestrować własny handler i tak właśnie robiłem w apkach na Larwie a także tych, które korzystały jedynie z Whoopsa.

Jak znajdziesz lepszy sposób to oczywiście też chętnie tego użyję smile.gif

I trzeba mieć świadomość, że z Larwą za dużo nie poszalejesz bo to fw dość leciwy i skazany prędzej czy później na wymarcie (a na pewno w obecnej formie).
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.