У меня есть пакет Python, который содержит серию модулей, каждый из которых содержит библиотеку подпрограмм с центральным фокусом (т.е. один модуль может иметь подпрограммы, связанные с манипулированием текстом). Я хотел бы иметь возможность настроить ведение журнала для всего пакета, но дать пользователю возможность настраивать ведение журнала для данного модуля.
Я попытался сделать это с помощью родительских / дочерних регистраторов, чтобы у каждого модуля не было более одного регистратора. Я могу успешно использовать родительский / дочерний подход, если я настрою дочерние регистраторы в самом модуле, но я не могу найти правильный синтаксис для настройки дочерних регистраторов через файл конфигурации регистратора. Когда утилита ведения журнала Python считывает файл конфигурации, она подавляется любыми «ключами» регистратора, содержащими точечную нотацию (то есть, если я попытаюсь определить регистраторы «root, parent, parent.child», захват файла конфигурации будет подавляться на " parent.child "ключ").
Итак, я ищу решение, при котором для данного модуля должен быть только один регистратор, но пользователь может настроить ведение журнала для всего пакета одним способом, но другим способом для конкретного модуля. Подход родитель / ребенок казался наиболее многообещающим.
Если есть способ для модуля определить, для каких регистраторов менеджер ведения журнала имеет определения, я мог бы использовать и его. Например, допустим, я могу определить два регистратора в моем файле конфигурации ведения журнала с именами allUtil и textUtil. Если бы текстовый служебный модуль мог определить, был ли у диспетчера журналов определен логгер textUtil, он мог бы использовать его, в противном случае он бы использовал логгер allUtil. К сожалению, мне также не удалось найти правильный код Python для этого.
Я открыт для предложений.
Код библиотеки получает регистратор (с logging.getLogger(name)
) и использует его. Код приложения настраивает регистраторы (dictConfig
обычно является наиболее удобным методом). Код библиотеки НИКОГДА не должен пытаться настроить ведение журнала и не должен заботиться о том, какие регистраторы настроены и как.
Пожалуйста, опубликуйте MCVE. Настройка дочерних логгеров JustWorks (tm), я делаю это регулярно в проектах django.
Вот то, что я придумал, похоже, работает.
Настраивать:
В файле конфигурации журнала у меня есть следующее (показано только соответствующее содержимое)
[loggers]
keys=root,myapp,utils,miscUtils
.
.
.
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_myapp]
level=CRITICAL
handlers=consoleHandler
qualname=myapplogger
propagate=0
[logger_utils]
level=WARNING
handlers=consoleHandler
qualname=myapplogger.utils
propagate=1
[logger_miscUtils]
level=DEBUG
handlers=consoleHandler
qualname=myapplogger.utils
propagate=1
.
.
.
Когда я запускаю программу, сообщения журнала из основного модуля регистрируются сообщениями из INFO и ниже. Все модули utils, кроме miscUtils.py, будут регистрировать сообщения от WARNING и ниже. Однако все сообщения журнала, генерируемые модулем miscUtils.py, который использует средство ведения журнала myapplogger.utils.miscUtils, выдает сообщения журнала от DEBUG вниз.
С помощью файла конфигурации я теперь могу определять общие уровни журнала программы, уровни журнала пакета и уровни журнала модуля, если необходимо.
Насколько я понимаю, вы в основном хотите определить кучу регистраторов в файле конфигурации, а затем пусть каждый из ваших модулей обнаружит свой собственный настраиваемый регистратор в этой конфигурации, если он есть, или используйте универсальный универсальный, если нет настраиваемого один?