Python Logging使用dictConfig时出现循环导入问题
嵌套项目后日志模块循环导入导致无法配置自定义格式化器
问题描述
自定义日志模块独立存在时,通过dictConfig读取default.json配置文件可正常运行。将其嵌套到项目根目录projectroot后,执行from projectroot import tealogger触发循环导入错误,无法配置color格式化器。
初始目录结构
tealogger/ - configuration/ - default.json - __init__.py - formatter.py - ...
嵌套后目录结构
projectroot/ - tealogger/ - configuration/ - default.json - __init__.py - formatter.py - ...
错误回溯信息
Traceback (most recent call last): File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 400, in resolve found = getattr(found, frag) ^^^^^^^^^^^^^^^^^^^^ AttributeError: cannot access submodule 'tealogg' of module 'projectroot' (most likely due to a circular import) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 552, in configure formatters[name] = self.configure_formatter( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 664, in configure_formatter result = self.configure_custom(config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 479, in configure_custom c = self.resolve(c) ^^^^^^^^^^^^^^^ File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 403, in resolve found = getattr(found, frag) ^^^^^^^^^^^^^^^^^^^^ AttributeError: cannot access submodule 'tealogg' of module 'projectroot' (most likely due to a circular import) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/yk/Desktop/Project/Repository/Adobe/3DIQE/projectroot/projectroot/tealogger/__init__.py", line 128, in <module> tealogger = TeaLogger( ^^^^^^^ File "/Users/yk/Desktop/Project/Repository/Adobe/3DIQE/projectroot/projectroot/tealogger/__init__.py", line 100, in __new__ logging.config.dictConfig(DEFAULT_CONFIGURATION) File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 823, in dictConfig dictConfigClass(config).configure() File "/opt/python/substance3d_scene_automation_110_m_1089/lib/python3.11/logging/config.py", line 555, in configure raise ValueError('Unable to configure ' ValueError: Unable to configure formatter 'color'
核心细节
- 配置文件
default.json中自定义格式化器引用路径为projectroot.tealogger.formatter.ColorFormatter - 自定义日志类
TeaLogger在模块加载阶段就调用dictConfig加载配置
解决方案
1. 延迟配置加载
避免在模块导入时直接初始化TeaLogger和调用dictConfig,改为提供手动初始化方法:
# tealogger/__init__.py tealogger = None def init_logger(): global tealogger if not tealogger: logging.config.dictConfig(DEFAULT_CONFIGURATION) tealogger = TeaLogger()
使用方式:
from projectroot import tealogger tealogger.init_logger()
2. 调整格式化器引用路径
若projectroot已加入Python路径,可将配置文件中的格式化器路径简化为tealogger.formatter.ColorFormatter,避免嵌套层级引发的导入冲突。
3. 调整模块导入顺序
在__init__.py中先导入ColorFormatter,再执行配置加载,确保格式化器模块已完全初始化:
# tealogger/__init__.py from .formatter import ColorFormatter # 后续再初始化TeaLogger并调用dictConfig
内容的提问来源于stack exchange,提问作者YTKme
相关产品推荐
相关产品推荐

