logging setLevel, как это работает - PullRequest
31 голосов
/ 07 июля 2011

В документации по logging есть этот пример:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

Почему я должен установить уровень на logging.DEBUG дважды, для Logger и для StreamHandler?

Я понимаю, ch.setLevel(logging.DEBUG) установит уровень отладки для обработчика потока. Но каков эффект от установки уровня в логгер? Где этот уровень отражается?

Я получаю тот же вывод на консоль, если я изменяю уровень, например, INFO или Logger или StreamHandler.

То есть:

...........
logger.setLevel(logging.INFO)
............
ch.setLevel(logging.DEBUG)

дает тот же вывод в консоли, что и

...........
logger.setLevel(logging.DEBUG)
............
ch.setLevel(logging.INFO)

Ответы [ 3 ]

37 голосов
/ 07 июля 2011

Он предназначен для тонкой настройки (у вас может быть несколько обработчиков, и для каждого могут быть установлены разные уровни) - вы можете безопасно не устанавливать уровень в обработчике, что заставит его обрабатывать все сообщения (уровень NOTSET), иоставьте фильтрацию уровня в логгере.

Логгер также первым фильтрует сообщение на основе уровня - если вы установите логгер на INFO, а все обработчики на DEBUG, вы все равно не будете получать сообщения DEBUG наобработчики - они будут отклонены самим регистратором.Если для логгера установлено значение DEBUG, а для всех обработчиков - INFO, вы также не получите никаких сообщений DEBUG - потому что, когда регистратор говорит «хорошо, обработайте это», обработчики отклоняют его (DEBUG <INFO).

3 голосов
/ 08 октября 2013

Почему я должен установить уровень logging.DEBUG дважды, для logger и для обработчика потока.Я понимаю, что ch.setLevel (logging.DEBUG) установит уровень отладки для обработчика потока.Но каков эффект от установки уровня для логгера?Где отражается этот уровень?.

Это указано в документации:

"Метод setLevel (), как и в объектах регистратора, определяет наименьшую серьезность, котораябудет отправлен в соответствующий пункт назначения. Почему существует два метода setLevel ()? Уровень, установленный в регистраторе, определяет, какую серьезность сообщений он будет передавать своим обработчикам. Уровень, установленный в каждом обработчике, определяет, какие сообщения отправит этот обработчик."

Проверка под обработчиками: http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial

2 голосов
/ 30 мая 2013

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

  • Вы можете построить иерархию объектов Logger. Каждый из них будет изначально уровень не установлен (уровень NOTSET). эффективный уровень Объект логгера - это первый уровень, который имеет , установленный в иерархии на пути к корневому логгеру (возможно, NOTSET, если ни один уровень не был набор).

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

  • Это действие, во-первых, передает сообщение , что обработчики Logger, и второй (в зависимости от значения флага распространения ), передавая его каждому из обработчиков цепочки предков наверх, без учета фактических уровней каждого из регистраторов в цепочке .

Чтобы ответить на ваш вопрос, вам не нужно задавать его дважды в этом примере. Установка его в DEBUG только в Logger будет достаточной для того, чтобы сообщения журнала, отправленные непосредственно в ваш экземпляр Logger, могли попасть на консоль (поскольку по умолчанию уровень в новом StreamHandler по умолчанию NOTSET, поэтому он пропустит все).

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