You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:20:18