gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:17 25 4
gpt4 key购买 nike

我目前正在使用日志记录 python 模块来在编写 python 应用程序时记录调试语句。

一切都工作得很好,直到我需要记录动态导入 python 模块的语句。

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

此时一切工作正常,但我注意到日志记录模块存在一些问题。因为我是在运行时而不是静态地导入代码(静态= python 模块的开头)。 main_script 上的日志记录模块“似乎”停止了,而 side_script 则创建了一个新的日志记录模块。然后,由于处理程序写入日志而不是附加(按设计),新的日志记录模块会删除我的日志文件。

一个有趣的注意事项是,一旦我“经典”地在函数中导入另一个模块import Side_Script # NOT at the开头或动态地,日志记录模块就会重新启动,并且我当前的日志文件由于写入权限而被删除。不管我是否运行 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()

Side_Script.py

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.")

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.

有没有办法像 python 示例中那样保留相同的记录器? https://docs.python.org/3.5/howto/logging.html#logging-from-multiple-modules

希望这是足够的细节。

如果我可以澄清任何事情,请告诉我。

谢谢!

最佳答案

嗯。我当时就傻了。

感谢@Grismar,他发现我加载了两次配置,这覆盖了我的日志记录模块。然后删除我的日志,因为它是一个全新的模块。

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

Side_Script.py

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.

关于动态创建导入时的 Python 日志记录模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55112465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com