Heim >Backend-Entwicklung >Python-Tutorial >Python-Protokollierung mit einer einzelnen Datei (Funktionsname, Dateiname, Zeilennummer)

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

PHPz
PHPznach vorne
2024-02-08 22:00:211145Durchsuche

使用单个文件的 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': 9f80b6a9b02e2f6bd3a3a454f4c1763b}. 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
    ))

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen