Глядя на исходный код, мы видим следующее:
root = RootLogger(WARNING)
def getLogger(name=None):
if name:
return Logger.manager.getLogger(name)
else:
return root
То есть корневой логгер создается по умолчанию при импорте модуля. Следовательно, каждый раз, когда вы ищите корневой лозер (передав ложное значение, такое как пустая строка), вы будете получать объект logging.RootLogger
независимо от любого вызова logging.setLoggerClass
.
Что касается используемого класса логгера, мы можем видеть:
_loggerClass = None
def setLoggerClass(klass):
...
_loggerClass = klass
Это означает, что глобальная переменная содержит класс регистратора, который будет использоваться в будущем.
В дополнение к этому, глядя на logging.Manager
(используется logging.getLogger
), мы можем видеть это:
def getLogger(self, name):
...
rv = (self.loggerClass or _loggerClass)(name)
То есть, если self.loggerClass
не установлено (чего не будет, если вы не установили его явно), используется класс из глобальной переменной.
Следовательно, это особенность. Корневой регистратор всегда является объектом logging.RootLogger
, а другие объекты регистратора создаются на основе конфигурации на тот момент.