Вопрос по logging, python-2.7, exception-handling – Python: регистрация исключений с помощью пользовательских * kwargs

3

как вы знаете, модуль регистрации Python поддерживаетопределение * kwargs настроить записи журнала. Похоже, это не поддерживается дляпротоколирование исключений.

Мой вопрос: есть ли простой способ использовать пользовательские kwargs с logging.exception?

Ниже приведен минимальный пример:

import logging
import logging.handlers

def create_logger(): 
    """ initialize logging using sys log

    """
    logger = logging.getLogger()

    form = '%(asctime)s [%(levelname)-8s] %(xyz)s %(message)s'
    local_log_handler = logging.handlers.SysLogHandler(address='/dev/log')
    formatter = logging.Formatter(form)
    local_log_handler.setFormatter(formatter)

    logger.addHandler(local_log_handler)
    return logger

log = create_logger()
try:
    raise AttributeError("whatever")
except:
    log.warn('Alarm! Fire!', extra={'xyz':'POLICE'})
    log.exception('')

Выход:

Traceback (most recent call last):
  File "logexample.py", line 27, in <module>
    log.exception('')
  File "/usr/lib/python2.7/logging/__init__.py", line 1172, in exception
    self.error(msg, exc_info=1, *args)
  File "/usr/lib/python2.7/logging/__init__.py", line 1166, in error
    self._log(ERROR, msg, args, **kwargs)
  File "/usr/lib/python2.7/logging/__init__.py", line 1258, in _log
    self.handle(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 1268, in handle
    self.callHandlers(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 1308, in callHandlers
    hdlr.handle(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 748, in handle
    self.emit(record)
  File "/usr/lib/python2.7/logging/handlers.py", line 791, in emit
    msg = self.format(record) + '\000'
  File "/usr/lib/python2.7/logging/__init__.py", line 723, in format
    return fmt.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 467, in format
    s = self._fmt % record.__dict__
KeyError: 'xyz'

Syslog:

Jul 30 14:56:27 localhost 2012-07-30 14:56:27,131 [WARNING ] POLICE Alarm! Fire!

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

[app-thread1] [app-thread2] ...

Теперь я понимаю. Благодарю. magum
Если вы посмотрите на исходный код дляexception()вы увидите, что он вызываетerror() сmsg, *args а такжеexc_info=1, На самом деле вы можете увидеть это в приведенной выше трассировке. Vinay Sajip

Ваш Ответ

1   ответ
7

Вы можете просто использовать, например,

logger.error('Message with %s', 'args', exc_info=1, extra={...})
@ Алекс: Этоwas случайное упущение. Сейчас исправлено - смотритеbugs.python.org/issue15541
Хороший обходной путь @ Vinay-Sajip. Почему было решено, что logger.exception не должен принимать дополнительные данные? Это не выглядит как случайное упущение.
Вы уверены, что это работает? Я заменил свое log.exception следующей строкой: log.error ("a% s", ["sth"], exc_info = 1, extra = {"xyz": "POLICE"}), но это не будет отображаться в журналах. magum
@ Vinay-Sajip: потрясающе. Спасибо за обновление.
две маленькие ошибки с моей стороны: 1. 'sth' вместо ['sth'] 2. неверный уровень журнала magum

Похожие вопросы