J'imprime des messages d'exception Python dans un fichier journal avec logging.error
:
import logging
try:
1/0
except ZeroDivisionError as e:
logging.error(e) # ERROR:root:division by zero
Est-il possible d'imprimer des informations plus détaillées sur l'exception et le code qui l'a généré que juste la chaîne d'exception? Des choses comme les numéros de ligne ou les traces de pile seraient formidables.
python
exception
logging
exception-handling
probablement à la plage
la source
la source
exception
méthode appelle simplementerror(message, exc_info=1)
. Dès que vous passezexc_info
à l'une des méthodes de journalisation à partir d'un contexte d'exception, vous obtiendrez une traceback.sys.excepthook
(voir ici ) pour éviter d'avoir à encapsuler tout votre code dans try / except.except Exception:
parce que vous n'utiliseze
en aucune façon;)e
lorsque vous tentez de déboguer de manière interactive votre code. :) C'est pourquoi je l'inclus toujours.raise
à la fin de laexcept
portée. Sinon, la course continuera comme si tout allait bien.Une bonne chose à
logging.exception
ce sujet la réponse de SiggyF ne montre pas que vous pouvez passer dans un message arbitraire et l' exploitation forestière montrera toujours la pleine retraçage avec tous les détails d'exception:Avec le comportement de journalisation par défaut (dans les versions récentes) des erreurs d'impression uniquement
sys.stderr
, il ressemble à ceci:la source
''
si vous ne voulez vraiment pas taper un message ... cependant, la fonction ne peut pas être appelée sans au moins un argument, vous devrez donc lui donner quelque chose.L'utilisation des
exc_info
options peut être meilleure, pour vous permettre de choisir le niveau d'erreur (si vous utilisezexception
, ce sera toujours auerror
niveau):la source
logging.fatal
méthode est-elle dans la bibliothèque de journalisation? Je vois seulementcritical
.critical
, tout comme l'warn
estwarning
.Citant
Maintenant,
traceback
pourrait être utilisé ici.Utilisez-le dans Python 2 :
Utilisez-le dans Python 3 :
la source
ex_traceback
estex.__traceback__
sous Python 3, maisex_traceback
estsys.exc_info()
sous Python 2.Si vous utilisez des journaux simples - tous vos enregistrements du journal doivent correspondre à cette règle:
one record = one line
. En suivant cette règle, vous pouvez utilisergrep
et d'autres outils pour traiter vos fichiers journaux.Mais les informations de traceback sont multi-lignes. Donc ma réponse est une version étendue de la solution proposée par zangw ci-dessus dans ce fil. Le problème est que les lignes de trace pourraient avoir à l'
\n
intérieur, nous devons donc faire un travail supplémentaire pour se débarrasser de ces fins de ligne:Après cela (lorsque vous analyserez vos journaux), vous pouvez copier / coller les lignes de trace requises à partir de votre fichier journal et procédez comme suit:
Profit!
la source
Cette réponse s'appuie sur les excellentes réponses ci-dessus.
Dans la plupart des applications, vous n'appelerez pas directement logging.exception (e). Vous avez probablement défini un enregistreur personnalisé spécifique à votre application ou module comme celui-ci:
Dans ce cas, utilisez simplement l'enregistreur pour appeler l'exception (e) comme ceci:
la source
Vous pouvez enregistrer la trace de pile sans exception.
https://docs.python.org/3/library/logging.html#logging.Logger.debug
Exemple:
la source
Un peu de traitement de décoration (très lâchement inspiré par la monade peut-être et le levage). Vous pouvez supprimer en toute sécurité les annotations de type Python 3.6 et utiliser un style de formatage de message plus ancien.
fallible.py
Démo:
Vous pouvez également modifier cette solution pour renvoyer quelque chose d'un peu plus significatif que
None
de laexcept
partie (ou même rendre la solution générique, en spécifiant cette valeur de retour dansfallible
les arguments de).la source
Dans votre module de journalisation (si module personnalisé), activez simplement stack_info.
la source
Si vous pouvez faire face à la dépendance supplémentaire, puis utilisez twisted.log, vous n'avez pas à consigner explicitement les erreurs et cela renvoie également l'intégralité du suivi et de l'heure au fichier ou au flux.
la source
twisted
- être une bonne recommandation, mais cette réponse ne contribue pas vraiment beaucoup. Il ne dit pas comment utilisertwisted.log
, ni quels avantages il a sur lelogging
module de la bibliothèque standard, ni expliquer ce que l'on entend par "vous n'avez pas à consigner explicitement les erreurs" .Une façon propre de le faire consiste à utiliser
format_exc()
puis à analyser la sortie pour obtenir la partie appropriée:Cordialement
la source
.split('\n')[-2]
fait est jeter le numéro de ligne et retraçage du résultat deformat_exc()
- informations utiles que vous voulez normalement! De plus, il ne fait même pas un bon travail de ce ; si votre message d'exception contient une nouvelle ligne, cette approche n'imprimera que la dernière ligne du message d'exception, ce qui signifie que vous perdez la classe d'exception et la plupart du message d'exception en plus de perdre la trace. -1.