如何实现Python日志配置的字典与外部文件混合更新?
日志配置的嵌套字典深度更新方案
需求背景
- 测试模块日志配置需灵活调整:可为特定模块(如USB)开启自定义TRACE级别,或限制BLE模块日志仅输出INFO及以上
- 部分依赖模块(如Bleak)无法修改源码,只能通过外部配置调整日志
- 代码中已定义默认日志配置字典,需通过单独配置文件覆盖/更新配置,避免修改原代码中的默认字典
- Python原生字典
update()方法无法处理嵌套结构的更新,需实现深度更新逻辑
默认日志配置示例
debugConfig = { 'version': 1, 'loggers': { # 其他logger配置... 'usb_interface': { 'handlers': ['default', 'error', 'file'], 'level': 'DEBUG', 'propagate': False }, # 其他logger配置... } }
外部更新配置示例(从config.py读取)
conf.logger = { 'loggers': { 'usb_interface': { 'level': 'TRACE', }, }, }
深度更新实现代码
def updateConfig(conf, updates): for key in updates: if key in conf: # 若对应值均为字典,则递归更新嵌套结构 if isinstance(updates[key], dict) and isinstance(conf[key], dict): updateConfig(conf[key], updates[key]) else: # 非字典类型直接覆盖值 conf[key] = updates[key] # 应用更新并加载日志配置 updateConfig(debugConfig, config.logger) logging.config.dictConfig(debugConfig)
效果说明
该函数会递归遍历字典结构,仅覆盖配置中匹配的嵌套元素:
- 示例中
usb_interface的level会被更新为TRACE - 该logger的
handlers、propagate等其他参数保留默认配置
内容的提问来源于stack exchange,提问作者wdtj
相关产品推荐
相关产品推荐

