在Python打印中添加日期时间戳

时间:2011-02-03 08:22:33

标签: python debugging monkeypatching built-in

我正在尝试调试我依赖的 large 库的行为,它通过其许多源文件使用散布(没有过多的)调试打印语句。麻烦的是,大多数(如果不是全部)这些调试打印语句都不包含日期/时间戳,因此很难将应用程序级别的故障与库代码本身内的故障相关联。

我认为有可能猴子补丁内置的Python打印“功能”暂时而不是修改所有怀疑参与我所看到的故障的调试打印的源代码。 >,以便所有输出都以时间戳为前缀。

由于我正在使用的Python 2.6环境中的built-in print is not a function,我不知道这是否可行。如果有人这样做或使用另一个钩子进入Python获得了类似的结果,那么我将非常感谢你的建议,或者更好的解决这个问题的代码。

3 个答案:

答案 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()