Python:如何抑制来自第三方库的日志记录语句?

时间:2014-02-21 20:24:32

标签: python logging

我的日志记录设置如下

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 个答案:

答案 0 :(得分:10)

您使用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或更高。

答案 1 :(得分:2)

您要做的是对所有记录器应用过滤器,以便您可以控制发出的内容。我可以找到将过滤器应用于所有记录器的唯一方法是使用从logging.Logger派生的东西初始化日志记录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)

希望这有帮助!