web-dev-qa-db-fra.com

500 erreur sans rien dans les journaux Apache

Je développe actuellement une application basée sur flask. Il fonctionne très bien, créant le serveur manuellement à l’aide de app.run(). J'ai essayé de l'exécuter à travers mod_wsgi maintenant. Étrangement, j'obtiens une erreur 500 et rien dans les journaux. J'ai étudié un peu et voici mes conclusions.

  • L'insertion d'une ligne telle que print >>sys.stderr, "hello" fonctionne comme prévu. Le message apparaît dans le journal des erreurs.
  • Lorsque vous appelez une méthode sans utiliser de modèle, cela fonctionne parfaitement. Aucune erreur 500.
  • L'utilisation d'un modèle simple fonctionne bien aussi.
  • MAISdès que je déclenche un accès à la base de données à l'intérieur le modèle (par exemple, une boucle sur une requête), l'erreur se produit.

Mon instinct me dit que c'est SQLAlchemy qui émet une erreur, et peut-être qu'une configuration de journalisation entraîne la suppression du journal à un moment donné de l'application.

De plus, pour tester, j'utilise SQLite. Autant que je me souvienne, ceci n'est accessible qu'à partir d'un seul thread. Donc, si mod_wsgi génère plus de threads, cela pourrait casser l'application.

Je suis un peu désemparé car il ne dépasse que mod_wsgi, ce qui semble également engloutir mes erreurs. Que puis-je faire pour que les erreurs se retrouvent dans le journal des erreurs Apache?

Pour référence, le code peut être vu sur ce permalien github .

39
exhuma

Il s'avère que je n'avais pas complètement tort. L'exception a bien été lancée par sqlalchemy. Et comme il est transmis à stdout par défaut, mod_wsgi l'a ignoré silencieusement (pour autant que je sache).

Pour répondre à ma question principale: comment voir les erreurs générées par l'application WSGI?

C'est en fait très simple. Redirigez vos journaux vers stderr. La seule chose à faire est d’ajouter ce qui suit à votre script WSGI:

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

C'est la configuration de journalisation la plus banale. Comme je n'ai encore rien mis en place pour mon application, cela ira. Mais, je suppose qu’une fois l’application arrivée à maturité, vous aurez de toute façon une configuration de journalisation plus sophistiquée, ce qui ne vous fera donc rien.

Mais pour un débogage rapide et sale, cela ira très bien.

54
exhuma

Si vous mettez cela dans votre config.py, cela aidera considérablement à propager les erreurs jusqu'au journal des erreurs Apache:

PROPAGATE_EXCEPTIONS = True
0
Hidden Name

J'ai eu un problème similaire: "Erreur interne du serveur" occasionnelle sans journaux. Lorsque vous utilisez mod_wsgi, vous devez supprimer "app.run()" car cela démarrera toujours un serveur WSGI local, ce que nous ne souhaitons pas si nous déployons cette application sur mod_wsgi. Voir docs . Je ne sais pas si c'est votre cas, mais j'espère que cela pourra vous aider.

0
Daniel Lerch