2009-11-30 6 views
0

J'utilise le logger python de base dans django et il semble bien fonctionner. J'ai la configuration de journalisation dans mon setting.py comme;python se connectant à django

logging.baseConfig(level = logging.NOTSET,  
        format='a format',  
        datemt=' a datefmt',  
        filename='path to log',  
        filemode = 'a')  
logging.getLogger('').setLevel(logging.NOTSET)  

Ma question concerne les exceptions en propagation. Dans mon code si j'ai une clause try/except et attrape l'exception pour que je puisse l'enregistrer, quelle est la meilleure façon de propager cette erreur pour que je puisse rediriger vers ma page de 500 pages. J'ai utilisé

try: 
    do stuff 
except Exception, e: 
    logging.error(e) 
    raise 

mais je trouve que cela provoque l'enregistrement de l'exception deux fois. Existe-t-il un autre moyen de le faire ou est-ce que je fais quelque chose de mal?

Cordialement
Andrew

Répondre

1

Il n'y a pas besoin d'attraper l'exception juste afin que vous puissiez l'enregistrer. Vous pouvez le connecter et le gérer, ou bien le laisser grimper à un niveau plus élevé qui le connecte et le gère. Si vous souhaitez enregistrer des exceptions qui se produisent dans une vue que vous ne voulez pas gérer, vous pouvez installer un exception middleware qui enregistre l'exception et renvoie une réponse personnalisée que vous déterminez, ou None (pour renvoyer la réponse de Django normalement retourner).

Il y a un exemple de middleware d'exception extensible here, qui n'utilise pas réellement l'exploitation forestière, mais dont la méthode log_exception() vous pouvez sous-classe pour se connecter à l'exception, ou tout simplement utiliser cet extrait comme guide pour fournir votre propre middleware d'exception - il est fondamentalement juste une classe avec une méthode appelée process_exception:

class MyExceptionMiddleware: 

    def process_exception(self, request, exception): 
     #Do your logging here 

notez également que les enregistreurs ont une méthode exception() qui fonctionne comme error() mais comprend des informations de retraçage dans le journal.

0

Il y a une recette: http://code.activestate.com/recipes/466332/

Dans toute application quelque peu complexe, vous voulez probablement enregistrer et gérer la plupart des exceptions. La recette montre un moyen de séparer la journalisation de la gestion, de sorte qu'il n'est pas nécessaire d'invoquer explicitement le mécanisme de journalisation dans chaque clause try-except.

Questions connexes