Python的日志记录模块导致库调用自己的日志记录函数。

3

我的初衷只是记录我通过调用的数据

logger.debug(' testing ') 

在我的代码内部,我可以正常调用函数。这个没问题。

但是,在文件的最顶端初始化了一个日志记录器对象后,似乎我所使用的一个库(requests http lib)的日志记录器也被调用了。

08/24 10:01:34 - requests.packages.urllib3.connectionpool - INFO - connectionpool.py - 202 - Starting new HTTP connection (1): www.technicianonline.com
08/24 10:01:34 - requests.packages.urllib3.connectionpool - DEBUG - connectionpool.py - 296 - "GET / HTTP/1.1" 200 None
08/24 10:01:34 - requests.packages.urllib3.connectionpool - DEBUG - connectionpool.py - 296 - "GET / HTTP/1.1" 200 None
08/24 10:01:34 - root - DEBUG - finder.py - 47 - testing

我只需要根 - DEBUG 日志,因为那是我的。然而,所有这些请求日志也被包含在内。如果必须猜测的话,可能是因为Python是一种动态语言,变量是可见的,但这并不完全合理,因为requests可能会初始化自己的记录器。有什么想法吗?谢谢。

1
因为你正在捕获所有的日志。将根记录器调高或手动定义您想要记录请求的级别。 - Greg
1
请查看logging.config以了解如何配置logging模块。 - D.Shawley
3个回答

4

接受的答案并不是一个实际的解决方案。您不应该明确地照顾您使用的每个库实例化的每个记录器。使用logging.Filter也不是最好的选择,因为标准过滤器将抑制所有无法识别的消息,但您可能仍然希望从您的库中获取更高级别的消息。

正确的答案是遵循Greg评论中的两个建议。将根记录器设置得更高,并使用不同的记录器来处理您自己的消息,然后可以进行管理:

In [1]: import logging
In [2]: logging.basicConfig(level=logging.WARNING)
In [3]: l = logging.getLogger('myapp')
In [4]: l.setLevel(logging.DEBUG)
In [5]: l.debug('hello')
DEBUG:test:hello
In [6]: logging.getLogger('library').debug("you won't see me")
In [7]: logging.getLogger('library').critical("you need to see me")
CRITICAL:library:you need to see me

3
您可以执行以下操作:
logging.getLogger('requests').setLevel(logging.WARNING)

这将限制所有requests的输出级别为WARNING或更高(当然,如果您愿意,也可以设置更高的级别)。

同样的方法也适用于控制您可能使用的其他库的日志记录器的冗长程度。


1
您可以添加一个logging.Filter,它可以忽略来自子记录器的消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接