Модуль ведения журнала Python при динамическом создании импорта

#python #python-3.x #python-import #python-logging

#python #python-3.x #python-импорт #python-ведение журнала

Вопрос:

В настоящее время я использую модуль logging python для регистрации инструкций отладки при написании моего приложения на Python.

Все работает отлично, пока мне не понадобится регистрировать инструкции из динамически импортируемых модулей python.

Приложение Python, которое я создаю, выполняет скрипты Python и возвращает результаты из этих упомянутых скриптов Python. Думайте об этом как о тестовом модуле и его выполняющихся тестовых сценариях. Однако тестовые сценарии определяются во время выполнения с помощью файла. Таким образом, для запуска скриптов в runner я импортирую их динамически с помощью importlib.

На данный момент все работает отлично, однако я замечаю некоторые проблемы с модулем ведения журнала. Поскольку я импортирую код во время выполнения, а не статически (статически = начало модуля python). «Кажется», что модуль ведения журнала в main_script останавливается, в то время как side_script создает новый модуль ведения журнала. Затем новые модули ведения журнала удаляют мой файл журнала из-за того, что обработчик записывает в журнал, а не добавляет (по замыслу).

Интересное замечание заключается в том, что как только я импортирую другой модуль в функцию «классически» import Side_Script # NOT at the beginning of the file или динамически, модуль ведения журнала перезапускается, а мой текущий файл журнала удаляется из-за разрешений на запись. Независимо от того, запускаю ли я импорт 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.
  

Можно ли в любом случае сохранить тот же регистратор, что и в примере pythons?
https://docs.python.org/3.5/howto/logging.html#logging-from-multiple-modules

Надеюсь, что этого достаточно подробно.

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

Спасибо!

Комментарии:

1. Есть ли причина, по которой вы загружаете конфигурацию дважды? Кроме того, вы включаете его disable_existing_loggers в модуль, но не в основной, даже если вызов в основном произойдет после вызова в модуле.

2. Привет, @Grismar, так вот в чем была проблема! Я перечитывал конфигурацию регистратора. По иронии судьбы код, над которым я работал, с самого начала импортирует файл, который никогда не вызывал у меня проблем. Таким образом, порядок операций не перезаписывал другие файлы. В соответствии с примером с веб-сайта python, который я привел в сообщении, я просто изменил на import logging и избавился от файла конфигурации, и это работает.. Иногда ответ находится прямо перед вами… Спасибо 🙂

3. Пожалуйста — помогите кому-нибудь еще, если найдете такую возможность 🙂

Ответ №1:

Что ж. Я был тупым тупицей.

Благодаря @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.