Несовместимость между именами регистраторов времени импорта и конфигурацией журналов - PullRequest
3 голосов
/ 08 марта 2012

Я настраиваю свою запись в Python в main.py, читая файл и используя опцию fileConfig . Я хочу иметь возможность переключаться между тестированием и конфигурацией ведения журнала в реальном времени, поэтому сначала я хочу прочитать в отдельном файле конфигурации и извлечь из него путь к файлу конфигурации ведения журнала.

Проблема здесь в том, что другие файлы, которые я импортирую из main.py, получают свой собственный регистратор через log = getLogger(__name__), и это происходит во время импорта. Эти ссылки затем прерываются, когда загружается новая конфигурация, и эти модули заканчивают работу без регистрации, как я ожидаю.

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

1 Ответ

2 голосов
/ 08 марта 2012

Я не уверен из твоего вопроса, как именно что-то ломается, но вот как я это вижу. Различные модули, которые выполняют log = logging.getLogger(__name__), будут иметь действительные имена для своих регистраторов (имя регистратора = имя пакета), если только вы не захотите каким-либо образом переместить модули в другое место пакета.

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

Загрузка новой конфигурации с использованием fileConfig обычно просто устанавливает обработчики, средства форматирования и уровни в регистраторах.

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

Вы должны знать, что в более старых версиях Python (<= 2.5) вызовы <code>fileConfig неизбежно отключают существующие регистраторы, которые не были названы в конфигурации - в более поздних версиях Python (> = 2.6), это настраивается с помощью аргумента ключевого слова disable_existing_loggers=False, переданного в fileConfig. Возможно, вы захотите проверить это, поскольку это иногда приводит к неожиданному поведению (для этого параметра по умолчанию используется True, для совместимости с поведением в более старых версиях Python).

Если вы опубликуете более подробную информацию о том, что кажется неисправным, я мог бы предоставить более точную диагностику того, что происходит.

...