Python-Protokollierung mit einer einzelnen Datei (Funktionsname, Dateiname, Zeilennummer)

PHPz
Freigeben: 2024-02-08 22:00:21
nach vorne
1101 Leute haben es durchsucht

使用单个文件的 Python 日志记录(函数名、文件名、行号)

Frageninhalt

Ich versuche zu verstehen, wie die App funktioniert. Dazu füge ich Debug-Befehle als erste Zeile in den Hauptteil jeder Funktion ein, mit dem Ziel, den Namen der Funktion und die Zeilennummer (im Code) zu protokollieren, die die Nachricht an die Protokollausgabe sendet. Da diese Anwendung aus vielen Dateien besteht, möchte ich schließlich eine Protokolldatei erstellen, damit ich den Kontrollfluss der Anwendung besser verstehen kann.

Das weiß ich:

  1. Um den Funktionsnamen zu erhalten, kann ich das in C mit dem function_name.__name__ 但我不想使用 function_name (这样我就可以快速复制并粘贴通用的 Log.info("Message") 到正文中所有功能)。我知道这可以使用 __func__-Makro machen, aber bei Python bin ich mir nicht sicher.

  2. Um den Dateinamen und die Zeilennummer zu erhalten, habe ich gesehen (und ich glaube), dass meine Anwendung Python verwendet locals() 函数,但使用的语法我并不完全了解,例如: options = " LOG.debug('%(flag)s : %(flag_get)s' % locals()) 我尝试使用 LOG.info("My message %s" % locals()) 来生成类似 的内容{'self': <__main__.Class_name 对象位于 0x22f8cd0>}. Irgendwelche Eingaben dazu?

  3. Ich weiß, wie man die Protokollierung verwendet und Handler hinzufügt, um in einer Datei zu protokollieren, bin mir aber nicht sicher, ob ich eine einzige Datei verwenden kann, um alle Protokollmeldungen in der richtigen Reihenfolge der Funktionsaufrufe in meinem Projekt zu protokollieren.


Richtige Antwort


Sie haben hier einige irrelevante Fragen.

Ich beginne mit dem Einfachsten: (3). Mit logging können Sie alle Aufrufe in einer einzigen Protokolldatei oder einem anderen Ausgabeziel zusammenfassen: Sie werden in der Reihenfolge angeordnet, in der sie im Prozess auftreten.

Nächster Schritt: (2). Der Wert von locals() 提供当前范围的字典。因此,在没有其他参数的方法中,作用域中有 self,其中包含对当前实例的引用。所使用的让您感到困惑的技巧是使用字典作为 % 运算符的 rhs 的字符串格式。 "%(foo)s" % bar 将被替换为 bar["foo"].

Schließlich können Sie einige Selbstbeobachtungstechniken anwenden, die denen von pdb ähneln, um weitere Informationen aufzuzeichnen:

def autolog(message):
    "Automatically log the current function details."
    import inspect, logging
    # Get the previous frame in the stack, otherwise it would
    # be this function!!!
    func = inspect.currentframe().f_back.f_code
    # Dump the message + the name of this function to the log.
    logging.debug("%s: %s in %s:%i" % (
        message, 
        func.co_name, 
        func.co_filename, 
        func.co_firstlineno
    ))
Nach dem Login kopieren

Dadurch werden die eingehende Nachricht sowie der (ursprüngliche) Funktionsname, der Dateiname, in dem sie definiert wurde, und die Zeile in dieser Datei protokolliert. Weitere Informationen finden Sie unter Inspizieren – Live-Objekte prüfen .

Wie ich bereits in einem Kommentar erwähnt habe, können Sie auch jederzeit die Zeile import pdb; einfügen, um die <code>import pdb; 行,进入 <code>pdb 交互式调试提示符。 pdb.set_trace() interaktive Debug-Eingabeaufforderung aufzurufen. pdb.set_trace() und führen Sie Ihr Programm erneut aus. Auf diese Weise können Sie den Code schrittweise durchgehen und die Daten basierend auf Ihrer Auswahl überprüfen.

Das obige ist der detaillierte Inhalt vonPython-Protokollierung mit einer einzelnen Datei (Funktionsname, Dateiname, Zeilennummer). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage