在Paramiko中关闭日志记录

30 投票
3 回答
30546 浏览
提问于 2025-04-17 06:24

我正在使用Paramiko提供的ssh客户端,创建一个名为remoteSSH的函数,这个函数的代码放在remoteConnect.py文件里。

import paramiko
import logging
logger = paramiko.util.logging.getLogger()
logger.setLevel(logging.WARN)

def remoteSSH(username,userpasswd):
    ....

现在,我在另一个Python模块getData()(文件名是getdata.py)中调用这个remoteSSH函数。

from remoteConnect import *
import logging
logger2=logging.getLogger()
logger2.setLevel(logging.INFO)

但是,当我在代码中调用logger2.info('ccc')时,它也会在导入Paramiko模块的文件(也就是remoteConnect.py)中开启所有INFO级别的日志记录。

我该如何在remoteConnect.py中关闭日志记录,以便Paramiko不再输出所有的INFO级别消息呢?

3 个回答

1

在设置logger2之前,试试这个:

logging.basicConfig(level=logging.WARN)
3

你在 remoteConnect.py 文件中把根日志记录器的级别设置成了 WARN(应该是 WARNING),而在 getdata.py 文件中设置成了 INFO。我建议你不要在应用程序的不同模块中随意设置根日志记录器的级别;相反,应该在所有需要使用日志记录的模块中统一设置:

import logging

logger = logging.getLogger(__name__)

然后在那个模块里使用 logger.debug(...) 等等。接下来,在你应用程序的一个特定位置(通常是在 if __name__ == '__main__': 下面的逻辑中),设置你想要的日志级别和处理器,可以通过编程方式使用 basicConfig,或者通过一系列API调用来添加处理器、格式化器等,或者使用声明式配置(比如使用 fileConfigdictConfig API - 具体文档可以在 这里 找到)。

79

Paramiko给它的日志记录器起了名字。它的工作方式和其他语言中的日志模块(比如Java的JDK日志)类似。

我发现

logging.getLogger("paramiko").setLevel(logging.WARNING) 这个方法很有用。

(你可以把这个放在导入paramiko的模块里,只要确保'logging'模块也被启用就可以了)。

我花了一段时间才弄明白怎么做(实际上,直到我开始处理Java日志时,这个答案才浮现在我脑海中)。

撰写回答