Преобразовать строку из файла конфигурации в путь импорта - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть файл конфигурации здесь:

log:
  filename: 'log'
  format: '%(levelname)s:%(message)s'
  level: 'logging.INFO'

, который я пытаюсь использовать здесь в своей конфигурации регистрации:

logging.basicConfig(
    filename=str(config['log']['filename']),
    format=str(config['log']['format']),
    level=str(config['log']['level'])
)

Однако я получаю эту ошибку, вероятно, потому что япередавая строку, но для уровня ведения журнала необходим путь в модуле ведения журнала.

ValueError: Unknown level: 'logging.INFO'

Как преобразовать его в путь к модулю или есть другой подход, который я должен использовать?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Вы можете использовать logging.getLevelName('INFO') для преобразования строки в уровень журнала (который представляет собой целочисленный код). Так что, пока вы можете изменить свой конфигурационный файл на:

log:
  filename: 'log'
  format: '%(levelname)s:%(message)s'
  level: 'INFO'

Это должно работать

logging.basicConfig(
    filename=str(config['log']['filename']),
    format=str(config['log']['format']),
    level=logging.getLevelName(config['log']['level'])
)

PS Вам нужны приведения str ()?

0 голосов
/ 07 ноября 2019

Быстрый и хакерский способ:

Вы можете использовать eval(). Он выполняет код Python в строках. ( Документы )

Пример:

import logging

logging.basicConfig(
    level=eval('logging.INFO')
)

logging.info('Works!')

Выходы:

INFO:root:Works!

Хотя это работает, использование eval считается плохой практикой, посколькуВы можете выполнить любой код Python, так что это небезопасно, т. е. может передать что-либо в конфигурации, и оно будет выполнено в вашем приложении. Подробнее здесь .


Безопасный подход:

В вашем конфигурационном файле вы можете передать «ваши» ключевые слова определенного уровня, такие как info или warning и т. Д. ( Все уровни )

Пример конфигурации:

log:
  filename: 'log'
  format: '%(levelname)s:%(message)s'
  level: 'info'

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

import logging

#Create mappings
level_mapping = {'info': logging.INFO, 'warning': logging.WARNING}

#Read your config file
config = {} 

#When passed logging level doesn't exist in mappings, raise an exception
if config['log']['level'] not in level_mapping:
    raise ValueError('Invalid logging level passed in config!!!')

#Instantiate
logging.basicConfig(
    level=level_mapping[config['log']['level']]
)

Таким образом, у вас есть белый список принятых уровней в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...