Tak więc, kiedy gra z rozwojem mogę po prostu ustawić settings.DEBUG
się True
i jeśli occures błędach widzę to ładnie sformatowany, z dobrym śladu stosu i informacji żądania.
Ale na czymś w rodzaju strony produkcyjnej wolałbym raczej użyć DEBUG=False
i pokazać odwiedzającym jakąś standardową stronę błędu 500 z informacją, że pracuję nad naprawieniem tego błędu w tej chwili;)
Jednocześnie chciałbym mieć jakiś sposób na zalogowanie wszystkich te informacje (śledzenie stosu i informacje o żądaniach) do pliku na moim serwerze - więc mogę po prostu wyprowadzić je na moją konsolę i oglądać przewijanie błędów, e-mailem dziennik do mnie co godzinę lub coś w tym rodzaju.
Jakie rozwiązania do rejestrowania poleciłbyś dla witryny django, które spełniałyby te proste wymagania? Mam aplikację działającą jako fcgi
serwer i używam serwera WWW Apache jako frontendu (chociaż myślę o przejściu na lighttpd).
źródło
Odpowiedzi:
Cóż, kiedy
DEBUG = False
Django automatycznie wyśle pełne śledzenie każdego błędu do każdej osoby wymienionej wADMINS
ustawieniu, co dostaniesz powiadomienia prawie za darmo. Jeśli chcesz bardziej precyzyjnej kontroli, możesz napisać i dodać do swoich ustawień klasę oprogramowania pośredniego, która definiuje nazwaną metodęprocess_exception()
, która będzie miała dostęp do zgłoszonego wyjątku:http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception
Twoja
process_exception()
metoda może następnie wykonać dowolny typ logowania: zapis do konsoli, zapis do pliku itp., Itd.Edycja: chociaż jest to trochę mniej przydatne, możesz również nasłuchiwać
got_request_exception
sygnału, który zostanie wysłany, gdy wystąpi wyjątek podczas przetwarzania żądania:http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception
Ten sposób nie daje dostęp do obiektu wyjątku, jednak, więc metoda middleware jest znacznie łatwiej pracować.
źródło
logging.exception('Some message')
ze standardowym modułem rejestrowania w Pythonie działa dobrze w programie obsługi sginalgot_request_exception
, jeśli wszystko, co chcesz zrobić, to wylogować ślady stosu. Innymi słowy, śledzenie jest nadal dostępne wgot_request_exception
.Django Sentry to dobry sposób, jak już wspomniano, ale wymaga trochę pracy, aby go poprawnie skonfigurować (jako oddzielną stronę internetową). Jeśli chcesz tylko rejestrować wszystko w prostym pliku tekstowym, oto konfiguracja logowania, którą należy umieścić w pliku
settings.py
źródło
'include_html': True
NIE sprawia, że e-maile są po prostu „milsze”! Zawiera pełne śledzenie, w tym wartości ustawień i zmiennych lokalnych. Zgodnie z dokumentacją jest to kwestiadjango-db-log, o którym mowa w innej odpowiedzi, zostało zastąpione przez:
https://github.com/dcramer/django-sentry
źródło
Oczywiście James ma rację, ale jeśli chcesz rejestrować wyjątki w magazynie danych, jest już dostępnych kilka rozwiązań typu open source:
1) CrashLog to dobry wybór: http://code.google.com/p/django-crashlog/
2) Db-Log to również dobry wybór: http://code.google.com/p/django-db-log/
Jaka jest różnica między nimi? Prawie nic, co widzę, więc wystarczy jeden.
Użyłem obu i działają dobrze.
źródło
Minęło trochę czasu od przesłania najbardziej pomocnego kodu przez EMP. Właśnie go zaimplementowałem i podczas miotania się z jakąś opcją manage.py, aby spróbować ścigać błąd, otrzymałem ostrzeżenie o wycofaniu, że w mojej obecnej wersji Django (1.5.?) Filtr require_debug_false jest teraz potrzebne dla programu obsługi mail_admins.
Oto poprawiony kod:
źródło
Właśnie miałem irytujący problem z moim
fcgi
skryptem. Zdarzyło się to jeszcze zanim django się zaczęło. Brak logowania jest bardzo bolesny. W każdym razie, przekierowanie stderr do pliku jako pierwsza bardzo pomogło:źródło