Logging setLevel игнорируется
Следующий код копируется из документации. Я должен видеть все информационные журналы. Но я этого не делаю. Я вижу только предупреждение и выше, хотя я установил setLevel в INFO.
Почему это происходит? foo.py
:
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
Вывод:
workingDirectory$ python foo.py
warn message
error message
critical message
Где были отправлены сообщения информации и отладки?
Ответы
Ответ 1
Заменить линию
logger.setLevel(logging.DEBUG)
с
logging.basicConfig(level=logging.DEBUG, format='%(message)s')
и это должно работать как ожидалось. Если вы не настраиваете ведение журнала с помощью каких-либо обработчиков (как в вашем посте - вы только настраиваете уровень для своего регистратора, но нигде не используете обработчики), вы получите внутренний обработчик "последней инстанции", который настроен на вывод только сообщение (без другого форматирования) на уровне WARNING
.
Ответ 2
Попробуйте запустить logging.basicConfig()
там. Следует отметить, что вы упоминаете INFO, но используете DEBUG. Как написано, должно отображаться все пять сообщений. Замените DEBUG на INFO, и вы должны увидеть четыре сообщения.
import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
редактировать: у вас уже есть регистрация в другом месте вашего кода? Невозможно воспроизвести точное поведение, которое вы заметили, с указанным кодом.
Ответ 3
Технически это тоже "ответ", потому что он может "решить" проблему. НО мне точно не нравится. Это не интуитивно понятно, и я потерял 2+ часов из-за этого.
До:
import logging
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info('You can not see me')
# Or you can just use the following one-liner in command line.
# $ python -c "import logging; logger = logging.getLogger('foo'); logger.setLevel(logging.INFO); logger.info('You can not see me')"
После:
import logging
logging.debug('invisible magic') # <-- magic
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info('But now you can see me')
# Or you can just use the following one-liner in command line.
$ python -c "import logging; logging.debug('invisible magic'); logger = logging.getLogger('foo'); logger.setLevel(logging.INFO); logger.info('But now you see me')"
PS: Сравнивая его с текущим выбранным ответом и объяснением @Vinay-Sajip, я могу понять почему. Но все же, я бы хотел, чтобы это не сработало.
Ответ 4
Принятый ответ у меня не работает на Win10, Python 3.7.2.
Мое решение:
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
Это порядок чувствительный.