Реализация логгера уже одноэлементная.
Несколько вызовов logging.getLogger ('someLogger') возвращают ссылку на один и тот же объект регистратора. Это верно не только для одного модуля, но и для разных модулей, если они находятся в одном процессе интерпретатора Python. Это верно для ссылок на один и тот же объект; кроме того, код приложения может определять и настраивать родительский регистратор в одном модуле и создавать (но не настраивать) дочерний регистратор в отдельном модуле, и все вызовы регистратора к дочернему элементу будут передаваться родительскому. Вот основной модуль
Источник - использование журнала в нескольких модулях
Таким образом, вы должны использовать это -
Предположим, мы создали и настроили регистратор с именем main_logger в основном модуле (который просто настраивает регистратор, ничего не возвращает).
# get the logger instance
logger = logging.getLogger("main_logger")
# configuration follows
...
Теперь в подмодуле, если мы создадим дочерний регистратор, следуя иерархии имен «main_logger.sub_module_logger» , нам не нужно настраивать его в подмодуле. Достаточно просто создать регистратор в соответствии с иерархией именования.
# get the logger instance
logger = logging.getLogger("main_logger.sub_module_logger")
# no configuration needed
# it inherits the configuration from the parent logger
...
И он также не добавит дублирующий обработчик.
См. Этот вопрос для более подробного ответа.