代码之家  ›  专栏  ›  技术社区  ›  red888

我无法获取logging.config来加载我的自定义类

  •  0
  • red888  · 技术社区  · 2 年前

    我在log_conf.py中定义了一个自定义格式化程序。

    # log_conf.py
    class Custom(jsonlogger.JsonFormatter):
        def add_fields(self, log_record, record, message_dict):
            super().add_fields(log_record, record, message_dict)
            log_record["new_field"] = log_record["levelname"]
    
    logging.config.fileConfig(file_path)
    
    def get_logger(name):
        return logging.getLogger(name)
    

    在我的logger.ini文件中,我这样引用它:

    ....
    [formatter_json]
    class = log_conf.Custom
    

    如果我将log_conf.py和logger.ini放入正在使用它的同一模块中,则可以工作:

    from my_project.my_module import log_conf
    log = log_conf.get_logger(__name__)
    

    但我想把它放在一个不同的文件夹中,如下所示:

    my_project
        main.py
        my_module/
            stuff.py
        myconf/
            logger.ini
            log_conf.py
    

    如果我使用这种结构 from my_project.myconf import log_conf 我明白了 ModuleNotFoundError: No module named 'log_conf' .

    如果我将ini文件更改为 class = myconf.log_conf.Custom 它仍然找不到它。

    如果我将其更改为 class = my_project.myconf.log_conf.Custom 我明白了 AttributeError: cannot access submodule 'log_config' of module 'my_project.myconf' (most likely due to a circular import) .

    为什么当它们在模块的目录中时它能工作,并且当使用的Custom类的完整命名空间时抛出循环导入 class= ?

    0 回复  |  直到 2 年前
        1
  •  0
  •   red888    2 年前

    意识到问题是在加载配置文件的同一文件中定义了我的自定义类。

    如果正在调用的文件 logging.config.fileConfig("logging_ini_file") 包括ini文件指向的类,即: class = myproj.mymodule.file_that_loaded_this_ini_with_fileConfig.CustomThing 您会得到一个循环导入,因为fileConfig()正试图重新导入调用它的文件。

    推荐文章