Модуль регистрации Python при динамическом создании импорта - PullRequest
1 голос
/ 12 марта 2019

В настоящее время я использую модуль 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

Надеюсь, что достаточно деталей.

Дайте мне знать, если я смогу что-то уточнить.

Спасибо!

1 Ответ

0 голосов
/ 12 марта 2019

Хорошо. Я был тупой, тупой.

Благодаря @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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...