python - 在 python 日志库中查找 "not enough arguments..."的简单方法

标签 python debugging

您知道找到抛出“格式字符串参数不足”的日志记录调用的任何简单方法吗? 在我的工作站上,我修改了 logging/__init__.py 以打印 msg,这样我就可以轻松地在源代码中找到该行。

但是你知道在无法更改 python 标准库或无法轻松运行 pdb 的测试环境中应该做什么吗?

注意:traceback是没有意义的,被日志库发现了。 这是回溯:

  File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
    if self.shouldRollover(record):
  File "/usr/lib/python2.6/logging/handlers.py", line 144, in shouldRollover
    msg = "%s\n" % self.format(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 648, in format
    return fmt.format(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 436, in format
    record.message = record.getMessage()
  File "/usr/lib/python2.6/logging/__init__.py", line 306, in getMessage
    msg = msg % self.args
TypeError: not enough arguments for format string

这是标准库中捕获错误的代码

    try:
        if self.shouldRollover(record):
            self.doRollover()
        logging.FileHandler.emit(self, record)
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        self.handleError(record)

Alex 建议的解决方案: 我包装了 getMessage 以打印消息和参数。这是代码:

def print_log_record_on_error(func):
    def wrap(self, *args, **kwargs):
        try:
            return func(self, *args, **kwargs)
        except:
            import sys
            print >>sys.stderr, "Unable to create log message msg=%r, args=%r " % (
                                getattr(self, 'msg', '?'), getattr(self, 'args', '?'))
            raise
    return wrap
import logging
logging.LogRecord.getMessage = print_log_record_on_error(logging.LogRecord.getMessage)

最佳答案

通常,捕获异常(包括您提到的异常)的最佳方法是将可疑代码放在 try/try 子句中除了声明;在 except 子句中,您可以使用 traceback 模块或其他方式来查明错误语句。

否则未捕获的异常最终会出现在 sys.excepthook 中,如果需要,这是您可以用来获取回溯的另一种方式。

但是,我不认为 logging 模块有一个结构化的方式来告诉它“让异常传播”——在这种情况下,你最好的选择,尽管可能很脏,可能是猴子-修补。换句话说,您通常可以在运行时“更改 Python 标准库”——通过在其中将标识符设置为您自己的函数/类/等来包装标准库。例如,如果您知道问题出在 logging.warning 调用上,“概念验证”monkeypatch 可能是:

import logging, traceback

orgwarn = logging.warning
def mywarn(msg, *a):
  try: res = msg % a
  except TypeError:
    traceback.print_exc()
  return orgwarn(msg, *a)
logging.warning = mywarn

有更简洁的方法,但它们可能有些麻烦(例如,制作您自己的记录器类并将其设置为根记录器)。 Monkey-patching 不是在生产环境中运行的好方法(它对系统升级很脆弱,可能难以理解和维护等),但它可以用于调试和测试目的。

关于python - 在 python 日志库中查找 "not enough arguments..."的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2477934/

相关文章:

python - 不使用 "itertools.combinations"的组合

python - 使用 GroupKFold 和 sklearn 进行嵌套交叉验证

python - 有限嵌入式设备上的纪元秒到日期转换

python - Pycharm 和 matplotlib 仅在 Debug模式下工作

java - Spring FileSystemXmlApplicationContext getBeanDefinitionNames 返回空数组

visual-studio - Fiddler2 可以用于监视 Visual Studio 调试 session 中发出的 SOAP 请求吗

python - 调用 'createsuperuser' 时引发 UnicodeEncodeError

python - 使用可变数量的 WHERE 子句来匹配任意数量的关键字 pysqlite

ruby-on-rails - Rails验证或可能的路由错误

mac/eclipse 上的 c++ 在崩溃时不显示错误