Python Logging Modul: benutzerdefinierte Logger

8

Ich habe versucht, ein benutzerdefiniertes Attribut für die Protokollierung (Klassenname des Aufrufers, Modulname usw.) zu erstellen und blieb mit einer seltsamen Ausnahme hängen, die mir mitteilte, dass die im Prozess erstellte LogRecord-Instanz nicht über die erforderlichen Attribute verfügte. Nach ein paar Tests endete ich damit:

%Vor%

Dieses scheinbar korrekte Stück Code ergibt:

%Vor%

Fehler oder Funktion?

    
Pastafarianist 16.02.2012, 18:50
quelle

2 Antworten

5

Mit Blick auf den Quellcode können wir folgendes sehen:

%Vor%

Das bedeutet, dass beim Importieren des Moduls standardmäßig ein Stammlogger erstellt wird. Daher erhalten Sie jedes Mal, wenn Sie nach dem Root Looger suchen (indem Sie einen falschen Wert wie die leere Zeichenfolge übergeben), ein Objekt logging.RootLogger , unabhängig von einem Aufruf von logging.setLoggerClass .

In Bezug auf die verwendete Logger-Klasse können wir sehen:

%Vor%

Dies bedeutet, dass eine globale Variable die Logger-Klasse enthält, die in der Zukunft verwendet werden soll.

Zusätzlich sehen wir uns logging.Manager an (verwendet von logging.getLogger ) und können dies sehen:

%Vor%

Das heißt, wenn self.loggerClass nicht gesetzt ist (was nicht sein wird, wenn Sie es nicht explizit gesetzt haben), wird die Klasse aus der globalen Variable verwendet.

Daher ist es ein Feature. Der Root-Logger ist immer ein logging.RootLogger -Objekt und die anderen Logger-Objekte werden basierend auf der Konfiguration zu diesem Zeitpunkt erstellt.

    
jcollado 16.02.2012, 19:13
quelle
2

logging.getLogger() und logging.getLogger("") geben keine MyLogger zurück, da sie den Stammlogger der Protokollierungshierarchie zurückgeben, wie in Protokollierungsdokumentation :

  

logging.getLogger ([Name])

     

Geben Sie einen Logger mit dem angegebenen Namen zurück oder, wenn kein Name angegeben ist, geben Sie einen Logger zurück, der der Stammlogger der Hierarchie ist.

So, wie Sie den Logger eingerichtet haben:

%Vor%

Ich glaube nicht, dass dies mit dem KeyError zu tun hat, mit dem Sie Ihren Post begonnen haben. Sie sollten den Code veröffentlichen, der die Ausnahme ausgelöst hat ( test.py ).

    
David Robinson 16.02.2012 18:58
quelle

Tags und Links