Connectez-vous toutes les erreurs à la console ou un fichier sur le site Django

voix
13

Comment puis - je obtenir Django 1.0 à écrire toutes les erreurs à la console ou un fichier journal lors de l' exécution runserver en mode débogage?

Je l'ai essayé d'utiliser une classe de middleware avec fonction process_exception tel que décrit dans la réponse acceptée à cette question:

Comment connectez-vous des erreurs de serveur sur les sites de django

La fonction process_exception est appelé à quelques exceptions près (par exemple: assert (Faux) dans views.py) mais process_exception n'est pas appelé à d'autres erreurs comme ImportErrors (par exemple: thisclassdoesnotexist d'importation urs.py). Je suis nouveau à Django / Python. Est-ce en raison d'une distinction entre l'exécution et la compilation des erreurs? Mais je me attends runserver de se plaindre si elle était une erreur de compilation du temps et il ne fonctionne pas.

Je l' ai regardé la présentation fantastique de Simon Willison le débogage Django ( http://simonwillison.net/2008/May/22/debugging/ ) mais je ne vois pas une option qui fonctionne bien pour moi.

Dans le cas où il est pertinent, je vous écris une application Facebook et masques Facebook HTTP 500 erreurs avec leur propre message plutôt que de montrer la page d' information 500 awesomely de Django. Donc je besoin d' un moyen pour tous les types d'erreurs à écrire sur la console ou un fichier.

Edit: Je suppose que mon attente est que si Django peut retourner une page d'erreur 500 avec beaucoup de détails quand j'ai une mauvaise importation (ImportError) dans urls.py, il devrait être en mesure d'écrire les mêmes détails sur la console ou un fichier sans avoir à ajouter une gestion des exceptions supplémentaires au code. Je ne l' ai jamais vu la gestion des exceptions dans les déclarations d'importation.

Merci, Jeff

Créé 27/03/2009 à 18:30
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
2

Tout d'abord, il y a très peu d'erreurs de compilation que vous verrez dans un journal d'exception. Si votre code Python ne pas la syntaxe valide, il meurt bien avant que les journaux sont ouverts pour l'écriture.

En mode Django runserver, une déclaration « d'impression », écrit à stdout, que vous pouvez voir. Ce n'est pas une bonne solution à long terme, cependant, ne comptez pas sur elle.

Lorsque Django fonctionne sous Apache, cependant, il dépend du plug-in que vous utilisez. mod_python n'est pas facile à traiter. mod_wsgi peut être contraint à envoyer stdout et stderr dans un fichier journal.

Votre meilleur pari, cependant, est l' exploitation forestière module. Mettez une initialisation dans votre haut niveau urls.pypour configurer la journalisation. (Ou, peut - être, votre settings.py)

Assurez-vous que chaque module possède un enregistreur disponible pour l'écriture des messages du journal.

Assurez-vous que tous les services Web que vous appelez faire a un try / except autour, et vous écrivez les exceptions à votre journal.

Créé 27/03/2009 à 19:51
source utilisateur

voix
13

Il est un peu extrême, mais à des fins de débogage, vous pouvez activer le DEBUG_PROPAGATE_EXCEPTIONSréglage. Cela vous permettra de configurer votre propre gestion des erreurs. La meilleure façon de mettre en place dit la gestion des erreurs serait de passer outre sys.excepthook . Cela mettra fin à votre application, mais cela fonctionnera. Il peut y avoir des choses que vous pouvez faire pour ce tuer pas votre application, mais cela dépendra de ce que la plate - forme vous déployez cela pour. En tout cas, jamais l' utiliser dans la production!

Pour la production, vous êtes à peu près va avoir une vaste manipulation d'erreur en place. est quelque chose comme je l'ai utilisé une technique ceci:

>>> 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

Si vous utilisez LOG_ERROR comme décorateur sur votre point de vue, il se chargera automatiquement des erreurs se sont tout à l'intérieur.

Le processus _fonction d'exception est appelé à quelques exceptions près (par exemple: assert (Faux) dans views.py) mais le processus _exception n'est pas appelé à d' autres erreurs comme ImportErrors (par exemple: thisclassdoesnotexist d'importation urs.py). Je suis nouveau à Django / Python. Est - ce en raison d'une distinction entre l' exécution et la compilation des erreurs?

En Python, toutes les erreurs sont des erreurs d'exécution. La raison pour laquelle cela est à l'origine des problèmes est que ces erreurs se produisent immédiatement lorsque le module est importé avant que votre vue est jamais appelé. La première méthode que j'AFFICHÉES attraper des erreurs comme celles-ci pour le débogage. Vous pourriez être en mesure de comprendre quelque chose pour la production, mais je dirais que vous avez des problèmes plus graves si vous obtenez ImportErrors dans une application de production (et vous ne faites aucune importation dynamique).

Un outil comme pylint peut vous aider à éliminer ce genre de problèmes cependant.

Créé 27/03/2009 à 20:51
source utilisateur

voix
-1

Si vous êtes sur un système * nix vous pourriez

écrire dans un journal (par exemple. mylog.txt) en python puis exécutez « tail -f mylog.txt » dans la console

c'est un moyen pratique pour voir toute sorte de journal en temps quasi réel

Créé 28/03/2009 à 23:03
source utilisateur

voix
6

La fonction process_exception est appelé à quelques exceptions près (par exemple: assert (Faux) dans views.py) mais process_exception n'est pas appelé à d'autres erreurs comme ImportErrors (par exemple: thisclassdoesnotexist d'importation urs.py). Je suis nouveau à Django / Python. Est-ce en raison d'une distinction entre l'exécution et la compilation des erreurs?

Non, il est juste parce que le middleware process_exception est appelée que si une exception est levée dans la vue .

Je pense que DEBUG_PROPAGATE_EXCEPTIONS (comme mentionné d' abord par Jason Baker) est ce que vous avez besoin ici, mais je ne pense pas que vous ne avez pas besoin de faire quoi que ce soit supplémentaire (c. -à- sys.excepthook, etc.) si vous voulez juste le retraçage jeté à la console.

Si vous voulez faire quelque chose de plus complexe avec l'erreur (c. -à- dump dans un fichier ou DB), l'approche la plus simple serait le signal got_request_exception , qui Django envoie à toute exception liée demande, si elle a été élevée dans la vue ou non.

Les Get_Response et handle_uncaught_exception méthodes de lecture instructive django.core.handlers.BaseHandler sont (et bref) dans ce domaine.

sans avoir à ajouter une gestion des exceptions supplémentaires au code. Je ne l'ai jamais vu la gestion des exceptions dans les déclarations d'importation.

Regardez autour de vous un peu plus, vous verrez fait (souvent dans les cas où vous souhaitez gérer l'absence d'une dépendance d'une manière particulière). Cela dit, il serait bien sûr assez laid si vous deviez aller saupoudrage supplémentaire try-except bloque tout votre code pour faire un changement global sur la façon dont les exceptions sont gérées!

Créé 30/03/2009 à 05:53
source utilisateur


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