Python setLevel на StreamHandler не работает - PullRequest
4 голосов
/ 11 января 2012

У меня настроено ведение журнала следующим образом:

def setUp():

    LOG_FORMAT = '%(asctime)s %(levelname)-8s %(name)s %(message)s'
    #LOG_FORMAT = '%(asctime)s %(name)s %(message)s'

    logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
    formatter = logging.Formatter(LOG_FORMAT)

    ch = logging.StreamHandler()
    ch.setLevel(logging.ERROR)
    ch.setFormatter(formatter)
    logging.getLogger().addHandler(ch)

    LOG_FILENAME = 'file.log'
    fh = logging.FileHandler(LOG_FILENAME, 'w')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logging.getLogger().addHandler(fh)

Однако консоль по-прежнему показывает DEBUG сообщения.Я что-то здесь упускаю?

Обратите внимание, что установка уровня ERROR на fh работает нормально.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Из документации Python по logging.basicConfig :

Выполняет базовую настройку для системы ведения журнала, создав StreamHandler со средством форматирования по умолчанию и добавив его в корневой регистратор.

Когда вы установили уровень отладки корневого регистратора на logging.DEBUG и не отключили пересылку сообщений до корневого регистратора, ваши сообщения DEBUG регистрируются этим StreamHandler, созданным basicConfig

2 голосов
/ 11 января 2012

Я думаю, вам нужно убрать звонок на logging.basicConfig.Эта функция добавляет еще один logging.StreamHandler, который, вероятно, является тем, который печатает сообщения, которые вы не хотите печатать.

Чтобы проверить это, вы можете взглянуть на атрибут handlers для корневого регистратора(это список со всеми используемыми обработчиками) и проверьте, сколько logging.StreamHandlers.Также, вероятно, сообщение с уровнем, установленным на logging.ERROR, печатаются дважды из-за двух logging.StreamHandler s.

Мой последний совет: не используйте logging.basicConfig, если вы собираетесь явно настроить обработчики вкод.

Редактировать: Просто для полноты, исходный код logging.BasicConfig выглядит следующим образом:

if len(root.handlers) == 0:
    filename = kwargs.get("filename")
    if filename:
        mode = kwargs.get("filemode", 'a')
        hdlr = FileHandler(filename, mode)
    else:
        stream = kwargs.get("stream")
        hdlr = StreamHandler(stream)
    fs = kwargs.get("format", BASIC_FORMAT)
    dfs = kwargs.get("datefmt", None)
    fmt = Formatter(fs, dfs)
    hdlr.setFormatter(fmt)
    root.addHandler(hdlr)
    level = kwargs.get("level")
    if level is not None:
        root.setLevel(level)

, где вы можете видеть, что если не передано filename, то logging.StreamHandler создан.

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