动态创建导入时的Python日志记录模块
在编写python应用程序时,我目前正在使用logging python模块记录调试语句 在我需要从动态导入python模块记录语句之前,一切都很正常 我正在制作的python应用程序执行python脚本,并返回上述python脚本的结果。将其视为测试运行程序及其运行的测试脚本。但是,测试脚本是在运行时通过文件确定的。因此,要在运行程序中运行脚本,我将使用importlib动态导入它们 现在一切都很好,但是我注意到日志模块存在一些问题。因为我是在运行时而不是静态地导入代码(静态地=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模
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
,去掉了配置文件,它就可以工作了。。有时候答案就在你眼前。。。谢谢:)不客气-如果你有机会帮助别人:)