__Logger-Klasse __: Dies ist der Hauptteil der Protokollierung. Verwalten Sie von der Protokollgenerierung bis zum Senden an den gewünschten Speicherort. Handler und Filter können für jedes aus der Logger-Klasse generierte Objekt festgelegt werden. Logger hat eine hierarchische Struktur (später beschrieben) und erbt die übergeordneten Einstellungen durch Vererbung.
__root (rootLogger-Objekt) __: Ein Objekt der Standard-Logger-Klasse und das übergeordnete Objekt aller Logger. Muss einer sein. Alle in logging.info ()
usw. geschriebenen Protokolle fließen hier.
__Original Logger-Objekt __: Ein Objekt der ursprünglichen Logger-Klasse, das von getLogger (" Logger-Name ")
erstellt wurde. Durch Erstellen jeder Datei können Sie explizit sehen, um welche Datei es sich bei dem Protokoll handelt, und Sie können die Protokollstufe und den Handler für jede Datei festlegen. Es ist möglich, eine hierarchische Struktur zu erstellen (später beschrieben).
LogRecord: Protokollkörper. Erstellt von Logger.
Handler: Verwalten, wo LogRecord geliefert wird (Standardausgabe, Dateischreiben, HTTP-Anforderung usw.). In Logger angeben. → Verschiedene Handler: https://docs.python.org/ja/3/howto/logging.html#useful-handlers
Formatter: Geben Sie das Protokollformat an. Geben Sie im Handler an.
Filter: Verwalten Sie, welche Protokolle ausgegeben werden. Geben Sie in Logger oder Handler an.
Überprüfen Sie den Protokollierungsfluss mit mod2
und mod2.fuga
in der obigen hierarchischen Struktur.
https://docs.python.org/ja/3/howto/logging.html#logging-flow
loggingtest.py
import logging
import loggingtest2
logger = logging.getLogger("mod2")
logger.setLevel(logging.DEBUG)
#Formatgenerierung
formatter = logging.Formatter('parent: %(name)s [%(levelname)s] %(message)s')
#Handler-Generierung der Standardfehlerausgabe
handler = logging.StreamHandler()
#Verschiedene Einstellungen zum Handler
handler.setLevel(logging.ERROR)
handler.setFormatter(formatter)
#Schließen Sie einen Handler an den Logger an
logger.addHandler(handler)
if __name__ == "__main__":
loggingtest2.test()
loggingtest2.py
import logging
def test():
logger = logging.getLogger("mod2.fuga")
logger.setLevel(logging.DEBUG)
#Formatgenerierung
formatter = logging.Formatter('child: %(name)s [%(levelname)s] %(message)s')
#Generierung / Einstellung des Handlers
handler = logging.StreamHandler()
handler.setLevel(logging.WARNING)
handler.setFormatter(formatter)
logger.addHandler(handler)
#logger.propagate = False #Siehe unten
logger.error("bbb")
Wenn es in diesem Zustand ausgeführt wird, wird es sowohl vom übergeordneten als auch vom untergeordneten Handler ausgegeben.
$ python loggingtest.py
child: mod2.fuga [ERROR] bbb
parent: mod2.fuga [ERROR] bbb
Wie Sie sehen können, wenn Sie die Handlerbedingung von loggingtest2.py auf "CRITICAL" oder höher setzen, wird "child: ~~" nicht ausgegeben. Wenn Sie den Punkt "getLogger ()" entfernen und die hierarchische Struktur reduzieren Es wird nur child: ~~
ausgegeben, da der Handler des übergeordneten mod2 nicht mehr aufgerufen wird.
Die wörtliche Übersetzung von propagate lautet "propagate", und dieses Attribut gibt an, ob der LogRecord an sein übergeordnetes Element weitergegeben werden soll. Sie können bestätigen, dass das übergeordnete Element nicht aufgerufen wird, indem Sie im obigen Code "logger.propagate = False" auskommentieren.
Die Einstellungen für die Protokollierung können in einer separaten Datei namens "logging.conf" beschrieben und mit "fileConfig ()" gelesen werden. Infolgedessen kann der Teil der Protokollierungseinstellung vom Verarbeitungskörper getrennt werden. Einzelheiten finden Sie im offiziellen Dokument.
Recommended Posts