Rejestrować wszystkie błędy pocieszyć lub złożyć na miejscu Django

głosy
13

Jak mogę uzyskać Django 1.0 napisać wszystkie błędy na konsoli lub w pliku dziennika, gdy uruchomiony runserver w trybie debugowania?

Próbowałem przy użyciu klasy middleware z funkcją process_exception jak opisano w przyjętym odpowiedzi na to pytanie:

Jak się zalogować błędy serwera, na stronach django

Funkcja process_exception nazywa pewne wyjątki (np: assert (fałsz) w views.py), ale nie jest uzyskiwanie process_exception wezwał do innych błędów, takich jak ImportErrors (np thisclassdoesnotexist import w urs.py). Jestem nowy w Django / Python. Czy to z powodu jakiegoś rozróżnienia okresie czasu i czasu kompilacji błędów? Ale wtedy spodziewałbym runserver narzekać jeśli to był błąd czasu kompilacji i nie.

Widziałem wspaniałą prezentację Simon Willison w sprawie Django debugowania ( http://simonwillison.net/2008/May/22/debugging/ ), ale nie widzę opcji, która będzie działać dobrze dla mnie.

W przypadku, gdy jest to stosowne, Piszę aplikację Facebook i Facebook masek HTTP 500 błędy z własnej wiadomości zamiast pokazując Awesomely informacyjny 500 strony Django. Więc muszę sposób na wszystkie rodzaje błędów mają być zapisywane w konsoli lub pliku.

Edycja: Myślę, że moje oczekiwanie, że jeśli Django może powrócić do strony 500 błędów z dużą ilością szczegółów, kiedy mam zły import (ImportError) w urls.py, powinien on być w stanie napisać ten sam szczegół do konsoli lub plik bez konieczności dodawania dodatkowej obsługi wyjątków w kodzie. Nigdy nie widziałem, obsługę wyjątków wokół sprawozdania importowych.

Dzięki, Jeff

Utwórz 27/03/2009 o 18:30
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
2

Po pierwsze, istnieje bardzo niewiele błędów podczas kompilacji, które będzie można zobaczyć za pośrednictwem dziennika wyjątków. Jeśli kod Python nie posiada ważnego składni, umiera na długo przed dzienniki są otwarte na piśmie.

W trybie uruchomieniowego Django, jest „print” oświadczenie pisze na standardowe wyjście, które można zobaczyć. To nie jest dobre rozwiązanie długoterminowe, jednak, więc nie licz na to.

Kiedy Django działa pod Apache, jednak zależy to od typu plug-in, który używasz. mod_pythona nie jest łatwe do czynienia. mod_wsgi może być zmuszany do wysyłania stdout i stderr do pliku dziennika.

Najlepiej jednak jest rejestrowanie moduł. Położyć inicjalizacji do swojego najwyższego poziomu urls.pyskonfigurować rejestrowanie. (A może twój settings.py)

Bądź pewien, że każdy moduł posiada rejestrator dostępny do pisania wiadomości dziennika.

Bądź pewien, że każdy usług internetowych nawiązywanych połączeń ma try / z wyjątkiem bloku wokół niego, a piszesz wyjątki dzienniku.

Odpowiedział 27/03/2009 o 19:51
źródło użytkownik

głosy
13

To trochę ekstremalne, ale dla celów debugowania, można włączyć DEBUG_PROPAGATE_EXCEPTIONSustawienia. Pozwoli to, aby założyć własną obsługę błędów. Najprostszym sposobem skonfigurowania powiedział obsługa błędów byłoby zastąpić sys.excepthook . Będzie to zakończyć aplikację, ale to będzie działać. Nie mogą być rzeczy, które możesz zrobić, aby nie zabić swoją aplikację, ale to będzie zależeć od tego, co masz platforma do wdrażania tego. W każdym razie, nigdy nie używać tego w produkcji!

Do produkcji, jesteś dość dużo się dzieje, aby mieć rozległą obsługę błędów na miejscu. Jedną z technik Użyłem jest mniej więcej tak:

>>> def log_error(func):
...     def _call_func(*args, **argd):
...         try:
...             func(*args, **argd)
...         except:
...             print "error" #substitute your own error handling
...     return _call_func
...
>>> @log_error
... def foo(a):
...     raise AttributeError
...
>>> foo(1)
error

Jeśli używasz log_error jako dekorator na widoku, zostanie ona automatycznie obsługiwać cokolwiek się w nim błędy.

Proces _funkcja nazywa się wyjątek dla pewnymi wyjątkami (np: assert (fałsz) w views.py), ale proces _wyjątek nie jest uzyskiwanie wezwał do innych błędów, takich jak ImportErrors (np thisclassdoesnotexist import w urs.py). Jestem nowy w Django / Python. Czy to z powodu jakiegoś rozróżnienia okresie czasu i czasu kompilacji błędów?

W Pythonie, wszystkie błędy są błędy run-time. Powodem, dla którego to jest przyczyną problemów jest ponieważ te błędy występują natychmiast, gdy moduł jest importowany przed Państwa zdanie jest zawsze nazywany. Pierwsza metoda Zamieściłem złapie błędy jak te do debugowania. Możesz być w stanie dowiedzieć się czegoś o produkcji, ale będę argumentować, że masz gorsze problemy, jeśli jesteś coraz ImportErrors w app produkcji (i nie robisz żadnych dynamiczne importowanie).

Narzędzie jak pylint może pomóc wyeliminować te rodzaje problemów chociaż.

Odpowiedział 27/03/2009 o 20:51
źródło użytkownik

głosy
-1

Jeśli jesteś na systemie * nix mogłeś

Napisać do dziennika (np. mylog.txt) w python następnie uruchomić „tail -f mylog.txt” w konsoli

Jest to wygodny sposób, aby zobaczyć każdy rodzaj dziennika w czasie zbliżonym do rzeczywistego

Odpowiedział 28/03/2009 o 23:03
źródło użytkownik

głosy
6

Funkcja process_exception nazywa pewne wyjątki (np: assert (fałsz) w views.py), ale nie jest uzyskiwanie process_exception wezwał do innych błędów, takich jak ImportErrors (np thisclassdoesnotexist import w urs.py). Jestem nowy w Django / Python. Czy to z powodu jakiegoś rozróżnienia okresie czasu i czasu kompilacji błędów?

Nie, to tylko dlatego, process_exception middleware nazywa się tylko wtedy, gdy jest wyjątek w widoku .

Myślę DEBUG_PROPAGATE_EXCEPTIONS (jak wskazano najpierw przez Jason Baker) jest to, co trzeba tutaj, ale nie sądzę, nie trzeba robić nic dodatkowego (tj sys.excepthook itp), jeśli po prostu chcesz traceback zrzucana do konsoli.

Jeśli chcesz zrobić coś bardziej kompleks z błędem (tj zrzucić go do pliku lub DB), najprostsze podejście byłoby sygnałem got_request_exception , które Django wysyła żadnego wyjątku związane żądanie-, czy został on podniesiony w widoku lub nie.

W GET RESPONSE i handle_uncaught_exception metody django.core.handlers.BaseHandler są pouczające (i krótki) czytanie w tej dziedzinie.

bez konieczności dodawania dodatkowej obsługi wyjątków w kodzie. Nigdy nie widziałem, obsługę wyjątków wokół sprawozdania importowych.

Rozejrzeć się nieco więcej, zobaczysz to zrobić (często w przypadkach, w których chcesz pracować nieobecność zależność w jakiś szczególny sposób). Powiedział, że byłoby to oczywiście dość brzydki jeśli musiał przejść dodatkowe zraszanie try-z wyjątkiem bloków całym kodzie zrobić globalne zmiany jak wyjątki są obsługiwane!

Odpowiedział 30/03/2009 o 05:53
źródło użytkownik

Odpowiedział 13/11/2009 o 06:24
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more