Регистрация в Python - exc_info только для обработчика файлов - PullRequest
4 голосов
/ 30 мая 2011

Я определяю корневой логгер и обработчики для него:

_root = logging.getLogger()
_sh = logging.StreamHandler()
_fh = logging.FileHandler('./error.log', delay = True)
_root.addHandler(_sh)
_root.addHandler(_fh)

И экземпляр модуля логгера:

_log = logging.getLogger("Main")
# In other file
_log = logging.getLogger("Configuration")

Теперь я звоню _log.exception в блоке try..except:

_log.exception("Test")

Теперь я получаю трассировку в консоли и файле. Я пытаюсь подавить печать exc_info с помощью обработчика консоли, но не с помощью обработчика файла:

class _TraceBackFilter(logging.Filter):
    def filter(self, rec):
        rec.exc_info = None
        return True
_sh = logging.StreamHandler()
_sh.addFilter(_TraceBackFilter())
_root.addHandler(_sh)

Это работает как для файлового, так и для консольного обработчика, трассировка полностью удалена для всех обработчиков, но мне это нужно только для консоли. Есть ли способ подавить exc_info только для обработчика консоли, а не для обработчика файла?

EDIT:

Я изменяю _TraceBackFilter класс.

class _TraceBackFilter(logging.Filter):
    def filter(self, rec):
        if rec.exc_info:
            logging.getLogger(rec.name).log(rec.levelno, rec.getMessage())
            return False
        else:
            return True

Теперь он работает для обработчика консоли, но в файле я удвоил сообщения, одно с и без трассировки.

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Создайте подкласс logging.Formatter для обработчика консоли, который возвращает пустую строку из метода formatException.

Текст исключения помещается в запись (в атрибуте exc_text): если этоложное значение (например, пустая строка), тогда formatException() будет вызвано, чтобы заполнить его, иначе это не будет.Поэтому в вашем классе форматирования вам может потребоваться переопределить метод format() и установить record.exc_text в ложное значение перед вызовом метода суперкласса 'format(), чтобы обеспечить вызов переопределенного formatException().Например (не проверено):

class NoExceptionFormatter(logging.Formatter):
    def format(self, record):
        record.exc_text = '' # ensure formatException gets called
        return super(NoExceptionFormatter, self).format(record)

    def formatException(self, record):
        return ''
0 голосов
/ 30 мая 2011

Если обработчик _sh сначала обрабатывается этим фильтром, похоже, что он может изменять реальный объект трассировки.Поскольку один и тот же объект трассировки передается как _sh, так и _fh, _fh получает уже измененную трассировку.

Вы можете создать новый объект трассировки в этом фильтре, sans exc_info, или, возможно, просто поменять местами порядок, так addHandlerсначала вызывается _fh.

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