Python: как подавлять отчеты о регистрации из сторонних библиотек?
Мои настройки регистрации выглядят как
import requests
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('BBProposalGenerator')
Когда я запускаю это, я получаю журналы как
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): localhost
INFO:BBProposalGenerator:created proposal: 763099d5-3c8a-47bc-8be8-b71a593c36ac
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): localhost
INFO:BBProposalGenerator:added offer with cubeValueId: f23f801f-7066-49a2-9f1b-1f8c64576a03
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): localhost
INFO:BBProposalGenerator:evaluated proposal: 763099d5-3c8a-47bc-8be8-b71a593c36ac
Как я могу подавить заявления журнала из пакета requests
? так что я вижу только журналы из моего кода
INFO:BBProposalGenerator:created proposal: 763099d5-3c8a-47bc-8be8-b71a593c36ac
INFO:BBProposalGenerator:added offer with cubeValueId: f23f801f-7066-49a2-9f1b-1f8c64576a03
INFO:BBProposalGenerator:evaluated proposal: 763099d5-3c8a-47bc-8be8-b71a593c36ac
Спасибо
Ответы
Ответ 1
Вы вызвали basicConfig()
с уровнем logging.INFO
, который устанавливает эффективный уровень INFO
для корневого регистратора и всех регистраторов-потомков, которые не имеют явно заданных уровней. Это включает регистраторы requests
и объясняет, почему вы получаете эти результаты.
Вместо этого вы можете сделать
logging.basicConfig()
который оставит уровень по умолчанию по умолчанию WARNING
, но добавит обработчик, который выводит сообщения журнала на консоль. Затем установите уровень на вашем регистраторе на INFO
:
logger = logging.getLogger('BBProposalGenerator')
logger.setLevel(logging.INFO)
Теперь будут напечатаны события INFO
и более высокой степени тяжести, зарегистрированные в журнале BBProposalGenerator
, или любой из его потомков, но корневой регистратор (и другие его потомки, такие как requests.XXX
) останутся в WARNING
уровня и показывать только сообщения WARNING
или выше.
Конечно, вы можете указать более высокий уровень в вызове basicConfig()
- если вы указали ERROR
, например, вы увидите только ERROR
или выше от всех других регистраторов, но INFO
или выше от BBProposalGenerator
и его потомков.
Ответ 2
то, что вы хотите сделать, это применить фильтр ко всем регистраторам, чтобы вы могли управлять тем, что испускается. Единственный способ, которым я мог найти применение фильтра ко всем регистраторам, - это инициализировать класс Logger Logging каким-то производным от logging.Logger и применить там фильтр. Таким образом:
class MyFilter(logging.Filter):
def filter(self, record):
if record.name != 'BBProposalGenerator':
return False
return True
class MyLogger(logging.Logger):
def __init__(self, name):
logging.Logger.__init__(self, name)
self.addFilter(MyFilter())
И тогда все, что вам нужно сделать, - это то, что до того, как какие-либо создатели экземпляров создадут экземпляр, установите класс регистратора по умолчанию как ваш производный класс так:
logging.setLoggerClass(MyLogger)
logging.basicConfig(level=logging.INFO)
Надеюсь, это поможет!