Python logger setLevel игнорирует заданный уровень - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь написать регистратор в Python, но методу .setLevel, похоже, все равно, какой уровень ведения журнала я ему передаю. Вот минимально воспроизводимый пример:

import logging

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

logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical")

Вывод:

warning
error
critical

Как показано, я установил уровень моего объекта logger на DEBUG, но пока только сообщения с уровнями WARNING и выше выдаются.

Из документации of setLevel:

Устанавливает порог для этого регистратора на уровень. Сообщения журнала, которые менее серьезны, чем уровень, будут игнорироваться; сообщения журнала с уровнем серьезности или выше будут выдаваться обработчиком или обработчиками, обслуживающими это средство ведения журнала, если только уровень обработчика не был установлен на более высокий уровень серьезности, чем уровень.

В моем коде я вызывается setLevel, чтобы установить уровень данного объекта регистратора c, чтобы он соблюдал этот уровень. Каково объяснение такого поведения?

Я рассмотрел следующие вопросы о переполнении стека, и ни одно из решений не применимо к моему случаю.

Python регистратор не соблюдает setLevel?

python ведение журнала: setLevel () регистратора не применяется?

Я использую CPython 3.8.2

1 Ответ

2 голосов
/ 29 мая 2020

Ах, вы попали в точку, не осознавая:

, если только уровень хендлера не был установлен на более высокий уровень серьезности, чем уровень.

The root logger имеет уровень logging.WARNING, и его обработчик по умолчанию - это то, что вы используете с logger, если вы не укажете иное, явно указав logger обработчик.

Запуск logging.basicConfig() создаст явный обработчик для регистратора root, который не имеет таких же ограничений, как обработчик root.

import logging
logger = logging.getLogger('test')
logger.setLevel(logging.DEBUG)

logger.debug('invisible')
logger.warning('visible')

logging.basicConfig()

logger.debug('visible')
logger.warning('visible')
...