Из logging
howto для Python 2.7 (мой акцент):
Хорошим соглашением для использования при именовании регистраторов является использование регистратора уровня модуля, вкаждый модуль, который использует журналирование, имеет следующие имена:
logger = logging.getLogger(__name__)
Это означает, что имена регистраторов отслеживают иерархию пакетов / модулей , и интуитивно очевидно, где происходят событиязарегистрировано только из имени регистратора.
Звучит как хороший совет.
Теперь, logging
поваренная книга предоставляет пример для нескольких модулей, в которых используется жесткийимена регистраторов вместо константы __name__
.В «основном модуле» из примера мы находим
logger = logging.getLogger('spam_application')
, а во «вспомогательном модуле» находим
module_logger = logging.getLogger('spam_application.auxiliary')
Я скопировал этот пример дословно в папку пакета со следующей структурой:
cookbook-example
|- __init__.py
|- main_module.py
|- auxiliary_module.py
Это работает без проблем, производя ожидаемый вывод журнала из обоих основных модулейи вспомогательный модуль, но вот в чем дело:
Если я теперь заменю жестко запрограммированные имена регистраторов на константу __name__
, как рекомендовано в logging
howto , поваренной книгепример ломается: я получаю сообщения регистрации только от основного модуля, но ничего от вспомогательного модуля.
Я, должно быть, упускаю что-то очевидное.Есть идеи, что я делаю неправильно?
Примечание:
Есть много очень похожих вопросов и связанных ответов, например: 1 , 2 , 3 , 4 , 5 , 6 и многие другие.Тем не менее, ни один из них, кажется, не решает этот конкретный вопрос.
- Правка -
Вот минимальный пример, основанный на примере поваренной книги, с явными строками имени, замененными на __name__
.
main_module.py
import logging
import auxiliary_module
# create and configure main logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create console handler with a higher log level
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# create formatter and add it to the handler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# add the handler to the logger
logger.addHandler(handler)
logger.info('message from main module')
auxiliary_module.some_function()
primary_module.py
import logging
# create logger
module_logger = logging.getLogger(__name__)
def some_function():
module_logger.info('message from auxiliary module')