Python日志记录 - 禁用导入模块的日志记录

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (236)

我正在使用Python日志记录模块,并且想要禁用由我导入的第三方模块打印的日志消息。例如,我使用的内容如下:

logger = logging.getLogger()
logger.setLevel(level=logging.DEBUG)
fh = logging.StreamHandler()
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s')
fh.setFormatter(fh_formatter)
logger.addHandler(fh)

这会在我执行logger.debug(“我的消息!”)时打印出我的调试消息,但它也会打印出我导入的任何模块的调试消息(例如请求和许多其他事情)。

我只想看看我感兴趣的模块的日志消息。是否可以让日志记录模块执行此操作?

理想情况下,我希望能够告诉记录器从“ModuleX,ModuleY”打印消息并忽略所有其他消息。

我查看了以下内容,但我不想在每次调用导入函数之前禁用/启用日志记录: logging - 如何忽略导入的模块日志?

提问于
用户回答回答于

问题是getLogger不带参数的调用会返回记录器,因此当您设置级别时,logging.DEBUG您还要设置为使用该记录器的其他模块设置级别。

您可以通过使用根记录器来解决此问题。要执行此操作,只需将名称作为参数传递,例如模块的名称:

logger = logging.getLogger('my_module_name')
# as before

这将创建一个新的记录器,因此它不会无意中更改其他模块的日志记录级别。

显然你必须使用logger.debug而不是logging.debug因为后者是一个调用debug根记录器方法的便利函数。

高级日志教程中提到了这一点。它还允许您以简单的方式知道哪个模块触发了日志消息。

用户回答回答于

如果你打算使用python logging包,那么在每个使用它的模块中定义一个记录器是一种常见的约定。

logger = logging.getLogger(__name__)

许多流行的python包都是这样做的,包括requests。如果包使用此约定,则可以很容易地为其启用/禁用日志记录,因为记录器名称将与包名称相同(或者将是该记录器的子项)。您甚至可以将其记录到与其他记录器相同的文件中。

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

requests_logger = logging.getLogger('requests')
requests_logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
requests_logger.addHandler(handler)

扫码关注云+社区

领取腾讯云代金券