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

Спасибо

2 ответа

Вы назвали 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 и его потомки.

То, что вы хотите сделать, это применить фильтр ко всем регистраторам, чтобы вы могли контролировать то, что испускается. Единственный способ применить фильтр ко всем регистраторам - это инициализировать класс 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)

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

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