Мне действительно не хватает чего-то базового в модуле журналирования python.
В следующем коде я создаю объект регистратора (log
) и добавляю к нему два обработчика.Один с уровнем «ИНФО» и один с уровнем «ВНИМАНИЕ».Они оба должны печатать на стандартный вывод.Я ожидаю, что вызов log.info(msg)
приведет к одной копии msg
в моем stdout, а вызов log.warn(msg)
может привести к двум копиям msg
, напечатанным на моем stdout.Вот код:
import logging
import sys
logging.basicConfig()
log = logging.getLogger('myLogger')
log.handlers = []
h1 = logging.StreamHandler(sys.stdout)
h1.level = logging.INFO
h1.formatter = logging.Formatter('H1 H1 %(message)s ')
h2 = logging.StreamHandler(sys.stdout)
h2.level = logging.WARNING
h2.formatter = logging.Formatter('H2 H2 %(message)s')
log.addHandler(h1)
log.addHandler(h2)
print 'log.level == %s'%logging.getLevelName(log.level)
print 'log.info'
log.info('this is some info')
print 'done'
print 'log.warn'
log.warn('this is a warning')
print 'done'
Вывод действительно очень странный для меня.Вызов .info
не приводит к визуальному эффекту.Тем не менее, обращение к warn
приводит к двум копиям сообщения, напечатанным в stdout (что нормально), а также к одной копии, напечатанной в stderr (почему?).Это вывод вышеуказанного кода.Обратите внимание на форматирование последней строки в этом выводе.Эта строка выводится на stderr.
log.level == NOTSET
log.info
done
log.warn
H1 H1 this is a warning
H2 H2 this is a warning
done
WARNING:myLogger:this is a warning
Итак, мои вопросы:
- , почему мой вызов
info
не приводит к выводу, несмотря на то, что h1
's уровень имеет значение INFO? - , почему мой вызов
warn
приводит к дополнительному выводу в stderr?