我有一个使用我的几个导入子模块的脚本,每个子模块使用模块记录。其中一个我写了一个不好的代码行,但我可以弄清楚它在哪里。实际上,带有参数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()的错误调用
答案 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)