Python регистрация добавляет дополнительные обработчики - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь разобраться с модулем ведения журнала Python, который, откровенно говоря, пока недоступен. В настоящее время у меня есть один «основной» регистратор в моем основном скрипте:

logger = logging.getLogger(__name__)
    handler = logging.FileHandler('debug.log')
    handler.setFormatter(logging.Formatter('%(levelname)s: %(asctime)s: %(name)s: %(message)s'))
    logger.addHandler(handler)
    logger.setLevel(logging.DEBUG)
    logger.debug(
        '{} run for {} using {} values.'.format(
            skill, str(datetime.now()), key, mode
        )
    )

, и у меня есть дополнительный регистратор в импортированном модуле:

logger = logging.getLogger(__name__)
            handler = logging.FileHandler('debug.log')
            handler.setFormatter(logging.Formatter('%(levelname)s: %(asctime)s: %(name)s: %(message)s'))
            logger.addHandler(handler)

Однако, хотя я и говорю обоим регистраторам войти только в файл (оба имеют только те обработчики, которые я установил), я все еще получаю информацию, напечатанную в stout из регистратора root. Вызов журнала. root .handlers показывает, что у регистратора есть StreamHandler, который появляется только при импорте модуля, содержащего второй модуль.

Мой хакерский метод решения дополнительного потока - просто удалить из корневых обработчиков. Однако это похоже на неканоническое решение. Я предполагаю, что я каким-то образом неправильно реализовал модуль, а не как предназначенную функцию модуля. Как вы собираетесь правильно настроить логгеры в такой иерархической манере?

1 Ответ

0 голосов
/ 27 января 2020

Надлежащий [mcve] наверняка здесь поможет - я не могу воспроизвести этот root обработчик логгера, внезапно появляющийся на ровном месте.

Как говорится, вы все равно делаете неправильно: один одной из основных целей модуля logging, что явно не задокументировано, является разделение вызовов регистратора (.getLogger() и logger.log()) от конфигурации ведения журнала.

Дело в том, что код библиотеки не может знать, в каком контексте он будет использоваться - только приложение - поэтому код библиотеки НЕ должен пытаться настроить свои регистраторы в любом случае - просто получите регистратор и используйте его, точка , Тогда дело за приложением (здесь ваш скрипт main.py), чтобы настроить регистраторы для библиотек (подсказка: функция .dictConfig() - безусловно, самый удобный способ настроить все сразу).

...