В настоящее время я использую модуль Python для записи в журнал отладочных операторов при написании моего приложения на Python.
Все работает отлично, пока мне не нужно регистрировать операторы из динамически импортируемых модулей Python.
Приложение Python, которое я создаю, выполняет скрипты Python и возвращает результаты этих скриптов Python.Думайте об этом как об испытателе и выполняющих его сценариях тестирования.Однако сценарии тестирования определяются во время выполнения с помощью файла.Таким образом, для запуска сценариев в средстве запуска я импортирую их динамически с помощью importlib.
На данный момент все работает отлично, однако я замечаю некоторые проблемы с модулем регистрации.Поскольку я импортирую код во время выполнения, а не статически (статически = начало модуля python).Кажется, что модуль логирования в main_script останавливается, в то время как side_script создает новый модуль логирования.Затем новые модули журналирования стирают мой файл журнала из-за того, что обработчик записывает в журнал, а не добавляет (по проекту).
Интересно отметить, что как только я импортирую другой модуль в функцию "классически" import Side_Script # NOT at the beginning of the file
или динамически, модуль Logging перезапускается, и мой текущий файл журнала удаляется из-за разрешений на запись.Независимо от того, запускаю ли я импорт 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.
Есть ли в любом случае такой же регистратор, как в примере с питонами?https://docs.python.org/3.5/howto/logging.html#logging-from-multiple-modules
Надеюсь, что достаточно деталей.
Дайте мне знать, если я смогу что-то уточнить.
Спасибо!