2011-11-04 16 views
36

Obecnie rozwijam aplikację opartą na flask. Działa dobrze rozdaje serwer ręcznie przy użyciu app.run(). Próbowałem go teraz uruchomić przez mod_wsgi. O dziwo, dostaję błąd 500 i nic w dziennikach. Zbadałem trochę i oto moje odkrycia.500 Błąd bez niczego w dziennikach apache

  • Wstawianie linii, takiej jak print >>sys.stderr, "hello", działa zgodnie z oczekiwaniami. Komunikat pojawia się w dzienniku błędów.
  • Podczas wywoływania metody bez użycia szablonu działa dobrze. Błąd nr 500.
  • Użycie prostego szablonu również działa dobrze.
  • ALE jak tylko wyzwolę dostęp do bazy danych wewnątrz szablon (na przykład zapętlanie przez zapytanie) Otrzymuję błąd.

Moje gut mówi mi, że to SQLAlchemy, które emituje błąd, i może konfiguracja logowania spowoduje, że dziennik zostanie odrzucony w pewnym momencie aplikacji.

Dodatkowo do testowania używam SQLite. To, o ile pamiętam, można uzyskać tylko z jednego wątku. Więc jeśli mod_wsgi spawns więcej wątków, może przerwać aplikację.

Jestem trochę zagubiona, ponieważ tylko zrywa się z uruchomieniem za mod_wsgi, która również wydaje się połykać moje błędy. Co mogę zrobić, aby błędy pojawiły się w apache error_log?

Dla odniesienia, kod można zobaczyć on this github permalink.

Odpowiedz

52

Okazało się, że nie byłem całkowicie zły. Wyjątek został faktycznie rzucony przez sqlalchemy. Ponieważ domyślnie jest przesyłany strumieniowo do stdout, dyskretnie zignorowano go (o ile wiem).

Aby odpowiedzieć na moje główne pytanie: Jak wyświetlić błędy generowane przez aplikację WSGI?

To naprawdę bardzo proste. Przekieruj dzienniki na numer stderr. Jedyne co musisz zrobić, to dodać do skryptu WSGI:

import logging, sys 
logging.basicConfig(stream=sys.stderr) 

To jest najbardziej prozaiczna konfiguracja logowania. Ponieważ nie wprowadziłem jeszcze niczego na miejsce dla mojej aplikacji, zrobi to. Ale, jak sądzę, kiedy aplikacja dojrzeje, i tak będziesz miał bardziej wyrafinowaną konfigurację logowania, więc to cię nie ugryzie.

Ale dla szybkiego i brudnego debugowania, będzie to dobrze.

+6

http://flask.pocoo.org/docs/errorhandling/ wyjaśnia to również.Jeśli tryb debugowania jest włączony, błędy przepływają do dziennika apache. Gdy go wyłączysz, musisz mieć skonfigurowane rejestrowanie lub nie przejdą one nigdzie. Mogę potwierdzić, że 'logging.handlers.SMTPHandler' działa ładnie dla wdrożonych aplikacji. –

+0

@ robots.jpg: Brakowało mi tego ... Czasami najlepiej jest przeczytać kilka razy dokumenty ...;) – exhuma

+0

Sądzę, że są równoważne, z wyjątkiem tego, że są nieglobalne: 'app.logger.addHandler (logging.StreamHandler (stream = sys.stderr)) ' – jpmc26

0

Jeśli umieścisz to do swojego config.py będzie znacznie pomóc w propagowaniu błędy do dziennika błędów apache:

PROPAGATE_EXCEPTIONS = True 
0

miałem podobny problem: okazjonalne „wewnętrzny błąd serwera” bez logów. Kiedy używasz mod_wsgi, powinieneś usunąć "app.run()", ponieważ to zawsze uruchomi lokalny serwer WSGI, którego nie chcemy, jeśli wdrożymy tę aplikację do mod_wsgi. Zobacz docs. Nie wiem, czy to twoja sprawa, ale mam nadzieję, że to pomoże.

Powiązane problemy