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?
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:
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.
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
).