2014-03-03 2 views
0

Рассмотрим этот фрагмент кода, который я бегу под 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. Есть ли способ лучше?

ответ

1

страшная вещь, что любой модуль, который использует эти функции (или вызывает logging.basicConfig) нарушит покой моего протоколирования

Да, это может быть, но эти модули не будут следующим хорошая практика (которая документирована). Фактически, в приведенном выше фрагменте вы делаете это неправильно - вы не должны прикреплять обработчики к регистраторам (кроме NullHandler), за исключением кода от if __name__ == '__main__ в главном скрипте. Импорт кода не должен иметь побочных эффектов.

Функции удобства на уровне модуля предназначены для коротких сценариев, простого использования, а люди только начинают работу с протоколированием. Они не предназначены для использования, если требования к регистрации не ограничиваются этим.

+0

Спасибо за объяснение. Я вернулся и снова прочитал некоторые документы. Для потомков здесь [выдержка из документации] (http://docs.python.org/2/howto/logging.html#library-config), объясняя это: «* Примечание: * _ Настоятельно рекомендуется, чтобы вы делали не добавляйте обработчиков, отличных от 'NullHandler', к журналам вашей библиотеки. Это связано с тем, что конфигурация обработчиков является прерогативой разработчика приложений, который использует вашу библиотеку». – kuzzooroo

Смежные вопросы