Ich drucke Python-Ausnahmemeldungen in eine Protokolldatei mit logging.error
:
import logging
try:
1/0
except ZeroDivisionError as e:
logging.error(e) # ERROR:root:division by zero
Ist es möglich, detailliertere Informationen über die Ausnahme und den Code zu drucken, der sie generiert hat, als nur die Ausnahmezeichenfolge? Dinge wie Zeilennummern oder Stapelspuren wären großartig.
python
exception
logging
exception-handling
wahrscheinlich am Strand
quelle
quelle
exception
Methode ruft einfach auferror(message, exc_info=1)
. Sobald Sieexc_info
aus einem Ausnahmekontext an eine der Protokollierungsmethoden übergeben, erhalten Sie einen Traceback.sys.excepthook
(siehe hier ), um zu vermeiden, dass Sie Ihren gesamten Code in try / exception einschließen müssen.except Exception:
weil Siee
in keiner Weise verwenden;)e
wenn Sie versuchen, Ihren Code interaktiv zu debuggen. :) Deshalb schließe ich es immer ein.raise
am Ende desexcept
Bereichs hinzuzufügen . Andernfalls wird der Lauf fortgesetzt, als ob alles in Ordnung wäre.Eine nette Sache über
logging.exception
die SiggyF Antwort nicht zeigt , ist , dass Sie in einer beliebigen Nachricht passieren können, und die Protokollierung zeigt noch die vollen Zurückverfolgungs mit allen Ausnahme - Details:Mit dem Standardprotokollierungsverhalten (in neueren Versionen), bei dem nur Fehler gedruckt werden
sys.stderr
, sieht es folgendermaßen aus:quelle
''
wenn Sie wirklich keine Nachricht eingeben möchten. Die Funktion kann jedoch nicht ohne mindestens ein Argument aufgerufen werden, sodass Sie ihr etwas geben müssen.Die Verwendung von
exc_info
Optionen ist möglicherweise besser, damit Sie die Fehlerstufe auswählen können (wenn Sie sie verwendenexception
, befindet sie sich immer auf dererror
Stufe):quelle
logging.fatal
eine Methode in der Protokollierungsbibliothek? Ich sehe nurcritical
.critical
, genau wiewarn
zuwarning
.Zitieren
Jetzt
traceback
könnte hier verwendet werden.Verwenden Sie es in Python 2 :
Verwenden Sie es in Python 3 :
quelle
ex_traceback
vonex.__traceback__
unter Python 3 ist, aberex_traceback
vonsys.exc_info()
unter Python 2.Wenn Sie einfache Protokolle verwenden, sollten alle Ihre Protokolldatensätze dieser Regel entsprechen :
one record = one line
. Nach dieser Regel können Siegrep
und andere Tools verwenden, um Ihre Protokolldateien zu verarbeiten.Traceback-Informationen sind jedoch mehrzeilig. Meine Antwort ist also eine erweiterte Version der Lösung, die zangw oben in diesem Thread vorgeschlagen hat. Das Problem ist, dass Traceback-Zeilen enthalten sein können. Daher müssen
\n
wir zusätzliche Arbeit leisten, um diese Zeilenenden zu entfernen:Danach (wenn Sie Ihre Protokolle analysieren) können Sie die erforderlichen Traceback-Zeilen aus Ihrer Protokolldatei kopieren / einfügen und Folgendes tun:
Profitieren!
quelle
Diese Antwort baut auf den oben genannten ausgezeichneten auf.
In den meisten Anwendungen rufen Sie logging.exception (e) nicht direkt auf. Höchstwahrscheinlich haben Sie einen für Ihre Anwendung oder Ihr Modul spezifischen benutzerdefinierten Logger wie folgt definiert:
Verwenden Sie in diesem Fall einfach den Logger, um die Ausnahme (e) wie folgt aufzurufen:
quelle
Sie können den Stack-Trace ausnahmslos protokollieren.
https://docs.python.org/3/library/logging.html#logging.Logger.debug
Beispiel:
quelle
Ein bisschen Dekorationsbehandlung (sehr locker inspiriert von der Vielleicht-Monade und dem Heben). Sie können Anmerkungen vom Typ Python 3.6 sicher entfernen und einen älteren Formatierungsstil für Nachrichten verwenden.
fehlbar
Demo:
Sie können diese Lösung auch so ändern, dass sie etwas aussagekräftigeres als
None
dasexcept
Teil zurückgibt (oder die Lösung generisch machen, indem Sie diesen Rückgabewert infallible
den Argumenten angeben).quelle
Aktivieren Sie in Ihrem Protokollierungsmodul (falls benutzerdefiniertes Modul) einfach stack_info.
quelle
Wenn Sie mit der zusätzlichen Abhängigkeit fertig werden können, verwenden Sie twisted.log. Sie müssen Fehler nicht explizit protokollieren und geben auch den gesamten Traceback und die gesamte Zeit an die Datei oder den Stream zurück.
quelle
twisted
ist es eine gute Empfehlung, aber diese Antwort trägt nicht wirklich viel dazu bei. Es wird weder angegeben, wie es verwendet wirdtwisted.log
, welche Vorteile es gegenüber demlogging
Modul aus der Standardbibliothek hat, noch erklärt, was unter "Sie müssen Fehler nicht explizit protokollieren" zu verstehen ist .Eine saubere Methode besteht darin,
format_exc()
die Ausgabe zu verwenden und dann zu analysieren, um den relevanten Teil zu erhalten:Grüße
quelle
.split('\n')[-2]
müssen, ist , die Zeilennummer und den Traceback aus dem Ergebnis wegzuwerfenformat_exc()
- nützliche Informationen, die Sie normalerweise möchten! Was mehr ist, macht es nicht einmal einen guten Job davon ; Wenn Ihre Ausnahmemeldung eine neue Zeile enthält, wird bei diesem Ansatz nur die letzte Zeile der Ausnahmemeldung gedruckt. Dies bedeutet, dass Sie die Ausnahmeklasse und den größten Teil der Ausnahmemeldung zusätzlich zum Traceback verlieren. -1.