Как заставить python модульный регистратор работать с любым основным регистратором? - PullRequest
0 голосов
/ 09 апреля 2020

Я разработал модуль, который я хотел бы импортировать в любой сценарий, и в нем автоматически устанавливается модуль регистрации модулей ниже регистратора, установленного в основном сценарии, независимо от того, как называется главный регистратор (root, main, et c.)

т.е.

a.py

import module
log = logging.getLogger()
log.info("Test Main")
test()

b.py

import module
log = logging.getLogger('main')
log.info("Test Main")
test()

module.py

mod_log = logging.getLogger(__name__)
def test():
    mod_log.info("Test Mod")

Если скрипт успешно запустится, я ожидаю следующий вывод. Я просто не могу заставить его работать?

a.py

ROOT - Test Main
ROOT.module - Test Mod

b.py

main - Test Main
main.module - Test Mod

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Реализация шаблона Singleton Design класса Logger, основная задача которого - добавить форматер, установить уровень ведения журнала и фильтрацию и, наконец, вернуть экземпляр регистратора.

Затем использовать его для создания объекта:

logger = Logger.__call__().get_logger()
print(Logger())

Следуя вышеприведенному методу, вы создадите один и только экземпляр экземпляра регистратора, и независимо от того, где вы создаете объект класса Logger, он будет таким же старым экземпляром, если он был создан ранее.

0 голосов
/ 09 апреля 2020

Это невозможно, потому что невозможно определить, где был определен регистратор, и каким должен быть «основной» регистратор. Основной скрипт может определять любое количество регистраторов, включая ноль. Единственный регистратор, который гарантированно существует, - регистратор root.

Если вам достаточно просто сделать предположение, вы можете сделать свой регистратор дочерним по отношению к первому созданному регистратору.

module.py

import logging

logger_name = __name__

if logging.root.manager.loggerDict:
    parent = next(iter(logging.root.manager.loggerDict))
    logger_name = parent + '.' + logger_name

mod_log = logging.getLogger(logger_name)
...