[PYTHON] Es ist praktisch, stac_info und exc_info zu verwenden, wenn Sie Traceback in der Protokollausgabe durch Protokollierung anzeigen möchten.

Einführung

Wenn Sie die Standortinformationen zusammen mit den Standortinformationen ausgeben möchten, wenn Sie das Protokoll mit dem Logger von logging ausgeben. Es gibt. Um es greifbar auszudrücken, ich möchte eine Rückverfolgung. Sprechen Sie darüber, was zu tun ist, wenn Sie diesen Traceback in das Protokoll aufnehmen.

Blöder Weg

Natürlich gibt es eine Geschichte, in der Sie dem Protokoll selbst einen Traceback hinzufügen können. Wie nachstehend.

import logging
import traceback
logger = logging.getLogger("sample")


def foo():
    bar()


def bar():
    logger.info("bar")
    logger.info("tb: %s", "".join(traceback.format_stack()))


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    foo()

Traceback wird vorerst angezeigt.

INFO:sample:bar
INFO:sample:tb:   File "qr_64852sBQ.py", line 18, in <module>
    foo()
  File "qr_64852sBQ.py", line 8, in foo
    bar()
  File "qr_64852sBQ.py", line 13, in bar
    logger.info("tb: %s", "".join(traceback.format_stack()))

Es ist jedoch mühsam, sich die Mühe zu machen, den Traceback selbst abzurufen. Es ist seltsam, Python-Kenntnisse (import traceback) nur für die Protokollausgabe zu benötigen.

stack_info

Tatsächlich müssen Sie das Traceback nicht wie oben beschrieben selbst hinzufügen. Fügen Sie einfach "stack_info = True" hinzu, wenn Sie sich mit logger abmelden.

--- 00sample.py	2017-07-13 08:06:10.000000000 +0900
+++ 01sample.py	2017-07-13 08:09:06.000000000 +0900
@@ -1,6 +1,5 @@
 # -*- coding:utf-8 -*-
 import logging
-import traceback
 logger = logging.getLogger("sample")
 
 
@@ -9,8 +8,7 @@
 
 
 def bar():
-    logger.info("bar")
-    logger.info("tb: %s", "".join(traceback.format_stack()))
+    logger.info("bar", stack_info=True)

Wenn ich es ausführe, wird Traceback nach "Stack (letzter Aufruf zuletzt)" angezeigt.

INFO:sample:bar
Stack (most recent call last):
  File "qr_64852GWc.py", line 16, in <module>
    foo()
  File "qr_64852GWc.py", line 7, in foo
    bar()
  File "qr_64852GWc.py", line 11, in bar
    logger.info("bar", stack_info=True)

exc_info

Möglicherweise möchten Sie den Traceback der Position für das Auftreten von Ausnahmen anstelle der Position für die Protokollausgabe anzeigen. Zum Beispiel das gleiche Format wie bei Verwendung von "logger.exceptipn ()". Sie können dies tun, indem Sie "exc_info" anstelle von "stack_info" übergeben.

import logging
logger = logging.getLogger("sample")


def foo():
    bar()


def bar():
    logger.info("bar")
    1 / 0


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    try:
        foo()
    except:
        logger.info("hmm", exc_info=True)

Der Traceback der Position, an der der Nullteilungsfehler auftritt, wird aus dem Ausnahmeobjekt extrahiert und automatisch zusammengeschrieben.

INFO:sample:bar
INFO:sample:hmm
Traceback (most recent call last):
  File "qr_64852t0u.py", line 18, in <module>
    foo()
  File "qr_64852t0u.py", line 7, in foo
    bar()
  File "qr_64852t0u.py", line 12, in bar
    1 / 0
ZeroDivisionError: division by zero

Recommended Posts

Es ist praktisch, stac_info und exc_info zu verwenden, wenn Sie Traceback in der Protokollausgabe durch Protokollierung anzeigen möchten.
Wenn Sie es so verwenden möchten, wie es ist, wenn Sie es mit Lambda-Memo verwenden
[Python] Wenn Sie Ihr eigenes Paket im oberen Verzeichnis importieren und verwenden möchten
[Python] Wenn Sie alle Variablen in einer anderen Datei verwenden möchten
Wenn Sie diff in Python ausführen und sowohl Rückkehrcode als auch Ausgabe wünschen
Wenn Sie Wörter in Python zählen möchten, können Sie bequem Counter verwenden.
Verwendung ist und == in Python
Bequem zum Verwenden von Ebenen beim Laden von Bibliotheken auf Lambda
Es ist bequemer, csv-table zu verwenden, wenn Sie eine Tabelle mit Python-Sphinx schreiben
[OpenCV] Wenn Sie überprüfen möchten, ob es mit imread richtig gelesen wird
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Wie man Decorator in Django benutzt und wie man es macht
Was ist pip und wie benutzt du es?
Wenn Sie in der for-Anweisung plt.save möchten
Wenn Sie ein Argument in die Abschlussfunktion einfügen und später ausführen möchten
Verwenden Sie aggdraw, wenn Sie mit Kissen schön zeichnen möchten
Wenn Sie python2.x unter modernem Gentoo Linux verwenden möchten
Ich möchte, dass Sphinx bequem ist und von allen benutzt wird
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
Einführung in die Verwendung von Pytorch Lightning ~ Bis Sie Ihr eigenes Modell formatieren und auf Tensorboard ausgeben ~
NameError: Der globale Name'dot_parser 'ist nicht definiert und was ist zu tun, wenn er in Python angezeigt wird?
[Unterprozess] Wenn Sie ein anderes Python-Programm in Python-Code ausführen möchten
Erfassen Sie das Betriebsprotokoll automatisch im Terminal, wenn Sie sich bei Linux anmelden
Wenn es schwierig ist, das zu kopieren, was Sie mit vue erstellt haben
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Wenn Sie eine mehrdimensionale Liste nach mehreren Zeilen sortieren möchten
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Was tun, wenn der Fehler RuntimeError angezeigt wird: Python wird nicht als Framework installiert, wenn Sie versuchen, matplitlib und pylab in Python 3.3 zu verwenden