Python: logging.streamhandler не отправляет журналы в stdout

Я хочу использовать обработчик записи StreamHandler для python. Что я пробовал,

import logging
import sys
mylogger = logging.getLogger("mylogger")
h1 = logging.StreamHandler(stream=sys.stdout)
h1.setLevel(logging.DEBUG)

mylogger.addHandler(h1)

# now trying to log with the created logger
mylogger.debug("abcd") # <no output>
mylogger.info("abcd") # <no output>
mylogger.warn("abcd") # abcd

Мне что-то не хватает? Или делать какие-то ошибки? Почему журналы уровня INFO и DEBUG не входят в STDOUT?

Ответ 1

Вы должны установить уровень регистратора, а не только уровень обработчика:

mylogger.setLevel(logging.DEBUG)

Вот хорошая графика рабочего процесса ведения журнала, где вы можете увидеть, что либо журнал, либо обработчик проверяют уровень журнала:

http://docs.python.org/2/howto/logging.html#logging-flow

Значение по умолчанию logLevel равно WARNING, поэтому, даже если вы установите уровень вашего обработчика на DEBUG, сообщение не пройдет, поскольку ваш регистратор подавляет его (также по умолчанию WARNING).

Кстати, вы можете сделать базовое форматирование с помощью Formatter:

import logging
import sys

mylogger = logging.getLogger("mylogger")

formatter = logging.Formatter('[%(levelname)s] %(message)s')

handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)

mylogger.addHandler(handler)
mylogger.setLevel(logging.DEBUG)

mylogger.debug("This is a debug message.")
mylogger.info("Some info message.")
mylogger.warning("A warning.")

Выдает вывод

[DEBUG] This is a debug message.
[INFO] Some info message.
[WARNING] A warning.