能否向logging.getLogger()传入多个名称?AWS日志级别如何统一配置
Python第三方库日志级别批量配置问题解答
我们编写了一个涉及AWS的Python脚本(从S3存储桶获取文件,通过Fabric/Paramiko将处理后的文件传输至远程机器)。当开启DEBUG级日志时,控制台会输出大量第三方模块的日志。我们希望自身Python脚本日志级别为DEBUG,而AWS、Paramiko等外部模块日志级别为INFO,当前使用的代码如下:
logging.getLogger().setLevel(logging.DEBUG) logging.getLogger('boto').setLevel(logging.INFO) logging.getLogger('boto3').setLevel(logging.INFO) logging.getLogger('botocore').setLevel(logging.INFO) logging.getLogger('paramiko').setLevel(logging.INFO) logging.getLogger('invoke').setLevel(logging.INFO) logging.getLogger('urllib3').setLevel(logging.INFO) logging.getLogger('fabric').setLevel(logging.INFO) logging.getLogger('s3transfer').setLevel(logging.INFO)
该代码运行正常,但存在两个疑问,以下是对应解答:
疑问1:是否可以向logging.getLogger()传入多个名称,例如使用logging.getLogger('boto|boto3').setLevel(logging.INFO)这类写法?
不行,logging.getLogger()仅支持传入单个日志器名称作为参数,不支持用分隔符(如|)同时指定多个日志器。每个第三方库的日志器都是独立的顶级日志实体,必须单独调用logging.getLogger()获取对应的日志器实例后,再设置日志级别。
疑问2:能否通过一行代码统一将所有Amazon相关服务(如boto、boto3、botocore)的日志级别设置为INFO,而非逐个配置?
可以通过循环遍历日志器名称列表的方式实现简洁的批量配置,避免重复编写相同的代码。示例如下:
分批次配置(区分AWS相关和其他第三方库)
import logging # 设置根日志级别为DEBUG(自身脚本日志会继承此级别) logging.getLogger().setLevel(logging.DEBUG) # 批量配置AWS相关日志器级别为INFO aws_loggers = ['boto', 'boto3', 'botocore', 's3transfer'] for logger_name in aws_loggers: logging.getLogger(logger_name).setLevel(logging.INFO) # 批量配置其他第三方库日志器级别为INFO other_loggers = ['paramiko', 'invoke', 'urllib3', 'fabric'] for logger_name in other_loggers: logging.getLogger(logger_name).setLevel(logging.INFO)
更紧凑的单循环配置
如果不需要区分分组,也可以把所有目标日志器名称放到一个列表中,用一次循环完成配置:
import logging logging.getLogger().setLevel(logging.DEBUG) target_loggers = ['boto', 'boto3', 'botocore', 's3transfer', 'paramiko', 'invoke', 'urllib3', 'fabric'] for logger_name in target_loggers: logging.getLogger(logger_name).setLevel(logging.INFO)
需要注意的是:boto、boto3、botocore等AWS相关模块的日志器没有共同的父日志器(除了根日志器),因此无法通过设置某个父日志器的级别来统一控制它们,循环列表是最直接高效的批量配置方式。
内容的提问来源于stack exchange,提问作者kadina
相关产品推荐
相关产品推荐

