Python - как настроить дочерний регистратор с помощью файла конфигурации ведения журнала

У меня есть пакет Python, который содержит серию модулей, каждый из которых содержит библиотеку подпрограмм с центральным фокусом (т.е. один модуль может иметь подпрограммы, связанные с манипулированием текстом). Я хотел бы иметь возможность настроить ведение журнала для всего пакета, но дать пользователю возможность настраивать ведение журнала для данного модуля.

Я попытался сделать это с помощью родительских / дочерних регистраторов, чтобы у каждого модуля не было более одного регистратора. Я могу успешно использовать родительский / дочерний подход, если я настрою дочерние регистраторы в самом модуле, но я не могу найти правильный синтаксис для настройки дочерних регистраторов через файл конфигурации регистратора. Когда утилита ведения журнала Python считывает файл конфигурации, она подавляется любыми «ключами» регистратора, содержащими точечную нотацию (то есть, если я попытаюсь определить регистраторы «root, parent, parent.child», захват файла конфигурации будет подавляться на " parent.child "ключ").

Итак, я ищу решение, при котором для данного модуля должен быть только один регистратор, но пользователь может настроить ведение журнала для всего пакета одним способом, но другим способом для конкретного модуля. Подход родитель / ребенок казался наиболее многообещающим.

Если есть способ для модуля определить, для каких регистраторов менеджер ведения журнала имеет определения, я мог бы использовать и его. Например, допустим, я могу определить два регистратора в моем файле конфигурации ведения журнала с именами allUtil и textUtil. Если бы текстовый служебный модуль мог определить, был ли у диспетчера журналов определен логгер textUtil, он мог бы использовать его, в противном случае он бы использовал логгер allUtil. К сожалению, мне также не удалось найти правильный код Python для этого.

Я открыт для предложений.

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

Jacobr365 02.05.2018 16:06

Код библиотеки получает регистратор (с logging.getLogger(name)) и использует его. Код приложения настраивает регистраторы (dictConfig обычно является наиболее удобным методом). Код библиотеки НИКОГДА не должен пытаться настроить ведение журнала и не должен заботиться о том, какие регистраторы настроены и как.

bruno desthuilliers 02.05.2018 16:39

Пожалуйста, опубликуйте MCVE. Настройка дочерних логгеров JustWorks (tm), я делаю это регулярно в проектах django.

bruno desthuilliers 02.05.2018 16:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
1 203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот то, что я придумал, похоже, работает.

Настраивать:

  • У меня есть приложение под названием "myapp"
  • У меня есть пакет, который он использует, под названием "utils"
  • У меня есть модуль в пакете utils под названием miscUtils.

В файле конфигурации журнала у меня есть следующее (показано только соответствующее содержимое)

[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
.
.
.
  • В модуле utils.miscUtils.py я использую регистратор myapplogger.utils.misc.
  • Во всех остальных модулях пакета utils используются логгеры. myapplogger.utils.xxx, где xxx представляет конкретный модуль.
  • В основном программном модуле myapp.py я использую логгер myapplogger, но я явно установил его уровень на ИНФО.

Когда я запускаю программу, сообщения журнала из основного модуля регистрируются сообщениями из INFO и ниже. Все модули utils, кроме miscUtils.py, будут регистрировать сообщения от WARNING и ниже. Однако все сообщения журнала, генерируемые модулем miscUtils.py, который использует средство ведения журнала myapplogger.utils.miscUtils, выдает сообщения журнала от DEBUG вниз.

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

Другие вопросы по теме