如何使用模块日志记录调试脚本

时间:2015-04-01 10:57:27

标签: python logging

我有一个使用我的几个导入子模块的脚本,每个子模块使用模块记录。其中一个我写了一个不好的代码行,但我可以弄清楚它在哪里。实际上,带有参数var的典型日志记录输出的synthax是:

logging.info("my var=%s", var)

如果参数的数量与字符串中的%s数不对应,则会记录一条错误消息,如下所示:

Traceback (most recent call last):
File "/usr/lib/python2.6/logging/__init__.py", line 776, in emit
  msg = self.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 654, 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
ValueError: incomplete format

问题是这个错误信息是完全通用的:它没有显示问题出现的模块的名称,也没有显示代码行,也没有显示参数......这使我无法找到我写的地方对logging.info()的错误调用

2 个答案:

答案 0 :(得分:1)

Q& D braindead解决方案:编辑/usr/lib/python2.6/logging/init.py并在try / except子句中包装第776行:

try:
    msg = self.format(record)
except ValueError:
    import pdb; pdb.set_trace()

然后从shell重新运行您的代码并执行重新引发异常所需的任何操作。您将被发送到步骤调试器中,您可以从中检查整个调用堆栈。

问题解决后,回滚您的修改。并最终为logging模块提供补丁,以便发出更有用的错误消息......

哦,顺便说一下:当你记住刚触及的代码部分时,自动化测试是一种很好的方法,可以尽快发现这类错误。

答案 1 :(得分:0)

试试这个:

logging.info("my var=%s" % var)