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)

Это порядок чувствительный.