Рассмотрим этот фрагмент кода, который я бегу под Python 2.7.6:Как я могу предотвратить нарушения функции регистрации на уровне модуля?
import logging, sys
assert (__name__ not in logging.Logger.manager.loggerDict)
logger = logging.getLogger(__name__)
stdout_handler = logging.StreamHandler(sys.stdout)
logger.addHandler(stdout_handler)
logger.error("You'll see this once")
logging.debug("Imagine logging now happens in some other module, maybe via an import")
logger.error("You'll see this twice")
logger.propagate = False
logger.error("BUT this you'll only see once")
Это дает этот вывод:
You'll see this once
You'll see this twice
ERROR:__main__:You'll see this twice
BUT this you'll only see once
Проблема, кажется, что logging.debug вызовы регистрации. basicConfig:
удобные функциивыше уровня модуля, который делегатом корневого регистратора, называющие basicConfig(), чтобы гарантировать, что по крайней мере один обработчик Доступен (source).
Я хотел бы просто забрать из этого правила «Не использовать удобные функции уровня модуля», но страшно то, что любой модуль, который использует эти функции (или вызывает logging.basicConfig) сломается остальная часть моего ведения журнала. Таким образом, вместо этого урок может быть «всегда использовать propate = False для журналов, чей родитель является корневым журналом», но это не кажется правильным - для распространения по умолчанию необходимо по умолчанию использовать True. Есть ли способ лучше?
Спасибо за объяснение. Я вернулся и снова прочитал некоторые документы. Для потомков здесь [выдержка из документации] (http://docs.python.org/2/howto/logging.html#library-config), объясняя это: «* Примечание: * _ Настоятельно рекомендуется, чтобы вы делали не добавляйте обработчиков, отличных от 'NullHandler', к журналам вашей библиотеки. Это связано с тем, что конфигурация обработчиков является прерогативой разработчика приложений, который использует вашу библиотеку». – kuzzooroo