Python: 使用自定义 *kwargs 记录异常

4

正如您所知,Python日志记录模块支持使用*kwargs定义来自定义日志条目。但是这似乎不支持记录异常

我的问题:是否有一种简单的方法可以在logging.exception中使用自定义kwargs?

以下是一个最小化的示例:

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:一些背景信息,我正在使用线程编写一个进程,并希望以以下方式记录信息:

[应用程序-线程1] [应用程序-线程2] ...


1
如жһњж‚ЁжџӨзњ‹exception()зљ„жғђд»Әз ЃпәЊж‚ЁдәљеЏ‘зҺ°е®ѓдҢүз”ЁmsgгЂЃ*argsе’Њexc_info=1и°ѓз”Ёдғ†error()гЂ‚е®һй™…дёЉпәЊж‚ЁеЏҮд»ӨењЁдёЉйқұзљ„е›һжғҮдё­зњ‹е€°иү™дёЂз‚№гЂ‚ - Vinay Sajip
1个回答

8
你可以直接使用例如。
logger.error('Message with %s', 'args', exc_info=1, extra={...})

@vinay-sajip 的解决方案很不错。为什么决定 logger.exception 不接受额外的数据?这看起来不像是一个意外的遗漏。 - Alex
3
@Alex:这是一个意外的遗漏。现在已经被纠正了-请参见http://bugs.python.org/issue15541。 - Vinay Sajip
这似乎仍然打印原始的回溯信息,没有JSON格式化 :( info.error('my message', exc_info=1) 中的消息已经正确格式化,但是回溯信息仍然只是一个文本块,没有其他格式... - rofls
@rofls 为什么要使用JSON格式?在这个问题或评论中从未提到过JSON,直到你提出来。 - Vinay Sajip
抱歉,我正在尝试将JSON格式应用于回溯信息... 我以为这是将OP的格式规则应用于整个消息,包括回溯信息。 - rofls
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接