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)

Надеюсь, это поможет!