我正在尝试调试我依赖的 large 库的行为,它通过其许多源文件使用散布(没有过多的)调试打印语句。麻烦的是,大多数(如果不是全部)这些调试打印语句都不包含日期/时间戳,因此很难将应用程序级别的故障与库代码本身内的故障相关联。
我认为有可能猴子补丁内置的Python打印“功能”暂时而不是修改所有怀疑参与我所看到的故障的调试打印的源代码。 >,以便所有输出都以时间戳为前缀。
由于我正在使用的Python 2.6环境中的built-in print is not a function,我不知道这是否可行。如果有人这样做或使用另一个钩子进入Python获得了类似的结果,那么我将非常感谢你的建议,或者更好的解决这个问题的代码。
答案 0 :(得分:20)
由于你无法覆盖write
函数(它是只读的),一个简单的猴子补丁看起来像这样(将时间戳附加到每个打印行):
old_f = sys.stdout
class F:
def write(self, x):
old_f.write(x.replace("\n", " [%s]\n" % str(datetime.now())))
sys.stdout = F()
示例如下:
>>> print "foo"
foo [2011-02-03 09:31:05.226899]
答案 1 :(得分:5)
时间戳是开始(前置)而不是结束(附加)的替代解决方案:
old_out = sys.stdout
class St_ampe_dOut:
"""Stamped stdout."""
nl = True
def write(self, x):
"""Write function overloaded."""
if x == '\n':
old_out.write(x)
self.nl = True
elif self.nl:
old_out.write('%s> %s' % (str(dt.now()), x))
self.nl = False
else:
old_out.write(x)
sys.stdout = St_ampe_dOut()
答案 2 :(得分:0)
我不清楚100%来自Velizar的现有答案如何处理以多个\ n发送输出的情况。我不确定它是否可靠运行,并且我认为它可能依赖于输出流的潜在未记录行为。
这是我的解决方案,在每个打印行的开头添加时间戳,并可靠地处理多行/多行:
class TimestampFilter:
# pending_output stores any output passed to write where a \n has not yet been found
pending_output = ''
def write(self, message):
output = self.pending_output + message
(output, not_used, self.pending_output) = output.rpartition('\n')
if output != '':
timestamp = time.strftime("%Y-%m-%d %X")
output = timestamp + " " + output.replace("\n", "\n"+timestamp+" ")
print(output, file=sys.__stdout__)
sys.__stdout__.flush()
sys.stdout = TimestampFilter()