如何批量设置urllib3所有子日志记录器的日志级别?
批量配置urllib3所有子日志记录器的日志级别
问题描述
想要一次性配置所有urllib3.*子日志记录器的日志级别,无需逐个设置或过滤。原本以为设置主urllib3日志器会自动应用到子日志器,但实际测试发现仅主日志器生效:
loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict] for name in loggers: if args.debug: name.setLevel(logging.DEBUG) else: name.setLevel(logging.INFO) logging.getLogger('urllib3').setLevel(logging.WARN) # 仅主日志器生效,子日志器不受影响 print(loggers) # [ <Logger urllib3.util.retry (DEBUG)>, # <Logger urllib3.util (DEBUG)>, # <Logger urllib3 (WARNING)>, # <Logger urllib3.connection (DEBUG)>, # <Logger urllib3.response (DEBUG)>, # <Logger urllib3.connectionpool (DEBUG)>, # <Logger urllib3.poolmanager (DEBUG)>, # ... # ]
当前的变通方案是将自定义模块日志名称统一以root.开头,其余日志器设为WARN,但这种命名方式缺乏灵活性:
loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict] for name in loggers: if not re.search(r'^<Logger\sroot', str(name)): name.setLevel(logging.WARN) else: if args.debug: name.setLevel(logging.DEBUG) else: name.setLevel(logging.INFO) print(loggers)
解决方案
方法1:遍历筛选urllib3相关日志器
直接遍历已注册的所有日志器,筛选出urllib3主日志器及其子日志器,统一设置级别:
import logging # 遍历所有已注册的日志器名称 for logger_name in logging.root.manager.loggerDict: # 匹配urllib3主日志器和所有子日志器 if logger_name == 'urllib3' or logger_name.startswith('urllib3.'): logging.getLogger(logger_name).setLevel(logging.WARN)
方法2:利用日志层级继承(推荐)
Python日志器默认会继承父级的级别,但如果子日志器被显式设置过级别(比如你先给所有日志器设了DEBUG/INFO),继承关系会失效。可以清除子日志器的显式级别,让它们重新继承主日志器的设置:
import logging # 设置urllib3主日志器的级别 urllib3_root = logging.getLogger('urllib3') urllib3_root.setLevel(logging.WARN) # 遍历urllib3子日志器,清除显式级别以恢复继承 for logger_name in logging.root.manager.loggerDict: if logger_name.startswith('urllib3.'): logger = logging.getLogger(logger_name) logger.level = logging.NOTSET # 清除自定义级别,恢复继承逻辑
方法3:初始化阶段全局配置
如果在程序初始化时就配置日志,可以通过logging.config直接设置整个urllib3层级的规则,避免后续逐个调整:
import logging.config logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': False, 'loggers': { 'urllib3': { 'level': 'WARN', 'propagate': True # 可根据需求添加对应的handlers配置 } } })
这种方式下,所有urllib3.*子日志器会默认继承主日志器的级别,只要没有被单独显式设置,就会自动应用规则。
内容的提问来源于stack exchange,提问作者MortenB
相关产品推荐
相关产品推荐

