Подтвердить что ты не робот

Использование переменной при вызове logger.setLevel

Кто-нибудь знает, есть ли способ использовать переменную в функции setlevel() модуля Python Logging?

На данный момент я использую это:

Log = logging.getLogger('myLogger')
Log.setLevel(logging.DEBUG)

Но я бы хотел иметь это:

Log = logging.getLogger('myLogger')
levels = {'CRITICAL' : logging.critical,
    'ERROR' : logging.error,
    'WARNING' : logging.warning,
    'INFO' : logging.info,
    'DEBUG' : logging.debug
}
level = levels['INFO']
Log.setLevel(level)

Но, похоже, это не работает - просто ничего не регистрируется.

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

4b9b3361

Ответ 1

Вы также должны быть в состоянии сделать это:

Log = logging.getLogger('myLogger')
level = logging.getLevelName('INFO')
Log.setLevel(level)

Функция logging.getLevelName(lvl) работает в обоих направлениях. Я использую его, он работает (вы должны проверить свою реализацию Python, хотя).

Это избавляет вас от необходимости поддерживать собственный словарь и снижает вероятность опечаток.

Ответ 2

У меня были проблемы с Python 3, и у меня это получилось: https://docs.python.org/3/howto/logging.html

# myapp.py
import logging
import mylib

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

Ответ 3

Как насчет использования модуля getattr on logging?

import logging
str_level = 'DEBUG'
level = getattr(logging, str_level)
logger = logging.getLogger("my_logger")
logger.setLevel(level)
print(logger.getEffectiveLevel())

Ответ 4

logging.setLevel() принимает int или str.

Так что следующее прекрасно работает (по крайней мере, в Python 3.7):

logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")

Ответ 5

Я считаю, что использование дополнительной переменной среды очень удобно и гибко:

class Foo():
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        level = logging.getLevelName(os.environ.get('LOG_LEVEL', 'ERROR'))
        logging.basicConfig(level=level)

    def bar(self):
        self.logger.debug('Log something')