如何禁用特定模块进行日志记录

时间:2021-06-14 19:34:26

标签: python logging paramiko

我在 logging 级别设置了 INFO。但是,我想从特定模块中删除所有日志,无论级别如何:

[:pid:8229 2021-06-14 19:32:06,827] - INFO paramiko.transport:_log:L1819: Connected (version 2.0, client OpenSSH_7.6p1)
[:pid:8229 2021-06-14 19:32:06,846] - INFO paramiko.transport:_log:L1819: Authentication (publickey) successful!

我将如何执行以下等效操作?

logger = logging.getLogger(self.script_name)
logger.setLevel(logging.INFO)
logger.disableLogger(paramiko) # pseudocode

我想一种选择是做类似的事情:

logging.getLogger("paramiko").setLevel(logging.ERROR)

1 个答案:

答案 0 :(得分:1)

logging 模块没有模块级记录器的概念,因为每个记录器只是在基于名称的层次结构中建立起来的。 paramiko.transport 将始终按名称作为 paramiko 记录器的子记录器存在,而不是通过任何模块关联。因此,通过模块本身禁用日志记录并不是一个很好的方法,但是您可以通过执行类似 logging.getLogger('paramiko').setLevel(logging.CRITICAL+1) 的操作有效地禁用该记录器和所有子记录器的日志记录,因为每条日志消息都应该以低于此值的日志记录级别传播,这将导致任何日志消息在到达附加到根记录器的处理程序之前丢弃。

另一个问题是关于禁用所有日志记录,然后在需要时有选择地启用日志记录。要实现这样的目标,最快的方法是排除向根记录器添加任何处理程序,然后以“自下而上”的方式添加处理程序。您想要这样做的原因是,如果您最终将一个处理程序附加到一个记录器,该记录器是该处理程序已经附加到的记录器的子记录器,您将收到重复的日志消息,这绝对是值得注意的。< /p>