【问题标题】:Python: Logging exceptions with custom *kwargsPython:使用自定义 *kwargs 记录异常
【发布时间】:2012-07-30 12:54:36
【问题描述】:

您可能知道 python 日志记录模块支持 definition of *kwargs 自定义日志条目。 logging exceptions 似乎不支持此功能。

我的问题:有没有一种简单的方法可以将自定义 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'

系统日志:

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

PS:一点背景知识,我正在写一个带线程的进程,我想用以下方式记录信息:

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

【问题讨论】:

  • 如果您查看exception() 的源代码,您会发现它调用error()msg*argsexc_info=1。事实上,您可以在上面的回溯中看到这一点。

标签: logging exception-handling python-2.7


【解决方案1】:

你可以只使用例如

logger.error('Message with %s', 'args', exc_info=1, extra={...})

【讨论】:

  • 你确定这行得通吗?我用以下行替换了我的 log.exception:log.error("a %s", ['sth'], exc_info=1, extra={'xyz':'POLICE'}),但它不会出现在日志。
  • 我的两个小错误:1. 'sth' 而不是 ['sth'] 2. 错误的日志级别
  • 很好的解决方法@vinay-sajip。为什么决定 logger.exception 不应该接受额外的数据?这看起来不像是意外遗漏。
  • @Alex:这意外遗漏。现在已纠正 - 见bugs.python.org/issue15541
  • 这似乎仍在打印没有 JSON 格式的原始回溯 :(info.error('my message', exc_info=1) 中的消息格式正确,但回溯仍然只是一个没有其他格式的文本简介......跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多