Обработчик регистрации Python игнорируется в подмодулях - PullRequest
0 голосов
/ 02 июля 2018

ситуация

Мой обработчик логов настроен так в моем main.py

logger = logging.getLogger("__name__")
fh = logging.FileHandler("./log/error.log")
fh.setLevel(logging.WARN)
logger.addHandler(fh)

Из моего main.py я звоню некоторым @staticmethod в подмодуле sub.py. Поскольку они статические, в каждом методе в начале я получаю регистратор моего main.py, используя logger = logging.getLogger(__name__) (может быть, вы знаете лучший способ получить этот регистратор? В настоящее время это ломает DRY imho) .

вопрос

когда я что-то регистрирую в своем main.py с использованием, например, logger.error("something went wrong"), тогда он будет сохранен в моем файле error.log так, как я его настроил. не будет отправлено на консоль, как я хочу. Но , когда я делаю тот же лог-вызов из моего sub.py метода, он дополнительно отправляется на консоль (stderr), а это не то, что я хочу.

Что я делаю не так?

1 Ответ

0 голосов
/ 03 июля 2018

Ошибка печати уровня на консоль является конфигурацией по умолчанию, поэтому main.py не настраивает ваш регистратор.

Это потому, что main.py настраивает регистратор с буквальным именем "__name__". Sub настраивает регистратор с именем "main.sub" (при условии базовой структуры пакета и вы выполняете main.py).

Исправление

Самое быстрое решение - обновить эту строку в main.py:

logger = logging.getLogger("main")

Звонки на logger main.sub будут всплывать на logger main и попадать в его обработчик.

Заберите

Возможно, вы все равно захотите использовать __name__ в main.py, потому что вы читали, что это хорошая практика. Это касается только модулей, вызываемых другими модулями. Вот что нужно иметь в виду:

Если вы запустите python main.py :

'__name__' in main.py is still the same
__name__ in main.py resolves to '__main__'
__name__ in sub.py resolves to 'main.sub'

Если вы запустите python sub.py :

'__name__' in main.py is still the same
__name__ in main.py resolves to 'main'
__name__ in sub.py resolves to '__main__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...