动态创建导入时的Python日志记录模块

动态创建导入时的Python日志记录模块,python,python-3.x,python-import,python-logging,Python,Python 3.x,Python Import,Python Logging,在编写python应用程序时,我目前正在使用logging python模块记录调试语句 在我需要从动态导入python模块记录语句之前,一切都很正常 我正在制作的python应用程序执行python脚本,并返回上述python脚本的结果。将其视为测试运行程序及其运行的测试脚本。但是,测试脚本是在运行时通过文件确定的。因此,要在运行程序中运行脚本,我将使用importlib动态导入它们 现在一切都很好,但是我注意到日志模块存在一些问题。因为我是在运行时而不是静态地导入代码(静态地=python模

在编写python应用程序时,我目前正在使用logging python模块记录调试语句

在我需要从动态导入python模块记录语句之前,一切都很正常

我正在制作的python应用程序执行python脚本,并返回上述python脚本的结果。将其视为测试运行程序及其运行的测试脚本。但是,测试脚本是在运行时通过文件确定的。因此,要在运行程序中运行脚本,我将使用importlib动态导入它们

现在一切都很好,但是我注意到日志模块存在一些问题。因为我是在运行时而不是静态地导入代码(静态地=python模块的开头)。主脚本上的日志记录模块似乎停止了,而侧脚本创建了一个新的日志记录模块。然后,新的日志模块会删除我的日志文件,因为处理程序会写入日志,而不是附加(按设计)

一个有趣的注意事项是,只要我在一个函数中“经典地”
import Side_Script#而不是在文件的开头
或动态地导入另一个模块,日志模块就会重新启动,并且由于写入权限,我的当前日志文件会被删除。不管我是否运行python导入。所以我很确定它不是来自importlib

我不确定到底发生了什么事。是否可以在函数中动态创建的模块中保留相同的日志记录模块

我创建了一个基本示例来演示我的问题。注意,这不是我的实际应用程序,在我的应用程序中,正在导入的模块在运行时通过文件已知

Main_Script.py

import logging.config
import importlib

logging.config.fileConfig('Log_Config.conf')

logger = logging.getLogger('simpleExample')

def main():
    logger.info("Logging in the main script.")
    Test_Modulue = importlib.import_module('Side_Script')
    Results = Test_Modulue.Run_Script()

if __name__== "__main__":
    main()
import logging.config

logging.config.fileConfig('Log_Config.conf',disable_existing_loggers=False)

logger = logging.getLogger('simpleExample')

def Run_Script():
    logger.info("Logging in the Side script.")
import logging.config

logger = logging.getLogger('simpleExample')

def Run_Script():
    logger.info("Logging in the Side script.")
Side_Script.py

import logging.config
import importlib

logging.config.fileConfig('Log_Config.conf')

logger = logging.getLogger('simpleExample')

def main():
    logger.info("Logging in the main script.")
    Test_Modulue = importlib.import_module('Side_Script')
    Results = Test_Modulue.Run_Script()

if __name__== "__main__":
    main()
import logging.config

logging.config.fileConfig('Log_Config.conf',disable_existing_loggers=False)

logger = logging.getLogger('simpleExample')

def Run_Script():
    logger.info("Logging in the Side script.")
import logging.config

logger = logging.getLogger('simpleExample')

def Run_Script():
    logger.info("Logging in the Side script.")
Log_Config.conf

[logger_simpleExample]
level=DEBUG
handlers=consoleDebugCasual,fileHandlerDebugCasual,
qualname=simpleExample
propagate=0

[handler_consoleDebugCasual]
class=StreamHandler
level=DEBUG
formatter=SummaryFormatter
args=(sys.stdout,)

[handler_fileHandlerDebugCasual]
class=FileHandler
level=DEBUG
formatter=SummaryFormatter
args=('Debug_Log.txt','w')

[formatter_SummaryFormatter]
format=%(filename)s-%(lineno)d %(levelname)s: - %(message)s
当前日志输出:

Side_Script.py-8 INFO: - Logging in the Side script.
Main_Script.py-8 INFO: - Logging in the main script.
Side_Script.py-8 INFO: - Logging in the Side script.
理想的日志输出:

Side_Script.py-8 INFO: - Logging in the Side script.
Main_Script.py-8 INFO: - Logging in the main script.
Side_Script.py-8 INFO: - Logging in the Side script.
是否有任何方法可以像pythons示例中那样保留相同的记录器?

希望这足够详细

如果我能澄清什么,请告诉我


谢谢

嗯。我是哑巴

多亏了@Grismar,他发现我加载了两次配置文件,这两次都重写了我的日志模块。这将删除我的日志,因为它是一个新模块

因此,除了Side_Script.py之外,代码的修改将是相同的,即:

Side_Script.py

import logging.config
import importlib

logging.config.fileConfig('Log_Config.conf')

logger = logging.getLogger('simpleExample')

def main():
    logger.info("Logging in the main script.")
    Test_Modulue = importlib.import_module('Side_Script')
    Results = Test_Modulue.Run_Script()

if __name__== "__main__":
    main()
import logging.config

logging.config.fileConfig('Log_Config.conf',disable_existing_loggers=False)

logger = logging.getLogger('simpleExample')

def Run_Script():
    logger.info("Logging in the Side script.")
import logging.config

logger = logging.getLogger('simpleExample')

def Run_Script():
    logger.info("Logging in the Side script.")
现在输出为:

Main_Script.py-8 INFO: - Logging in the main script.
Side_Script.py-8 INFO: - Logging in the Side script.

你为什么要加载配置两次?此外,您在模块中包括
禁用现有的\u记录器,但不包括在main中,即使main中的调用将发生在模块中的调用之后。嘿@Grismar,这就是问题所在!我正在重新阅读记录器配置。具有讽刺意味的是,我从一开始就处理导入文件的代码从未给我带来任何问题。因此,操作顺序没有覆盖其他文件。根据我在文章中给出的python网站上的示例,我只是更改为
import logging
,去掉了配置文件,它就可以工作了。。有时候答案就在你眼前。。。谢谢:)不客气-如果你有机会帮助别人:)