在Python打印中添加时间戳

17 投票
5 回答
18282 浏览
提问于 2025-04-16 11:08

我正在调试一个我依赖的大型库的行为,这个库在很多源文件中使用了大量的调试打印语句。问题是,这些调试打印语句几乎都没有日期/时间戳,所以很难把应用层的故障和库代码中的故障联系起来。

我不想修改所有可能与我看到的故障有关的调试打印的源代码,所以我想是否可以临时修改内置的Python打印“函数”,让所有输出前面都加上时间戳。

因为我使用的Python 2.6环境中,内置的打印不是一个函数,所以我不知道这样做是否可行。如果有人做过这个,或者用其他方法在Python中实现了类似的效果,我会非常感激你们的建议,或者更好的是,给我提供一个解决这个问题的代码。

5 个回答

4

要在Python的 print 语句中添加时间戳,你可以重写 print 函数。

首先,保留原来的 print() 函数。

_print=print

然后,定义你自己的 print 函数,并使用 _print 来进行打印:

从日期时间模块导入 datetime

def print(*args, **kw):
    _print("[%s]" % (datetime.now()),*args, **kw)

现在你会得到类似这样的输出:

>>> print("hi")
[2022-03-08 23:53:48.258767] hi

注意:这适用于 python3,但对于 python2 也很容易修改。

9

一种替代方案是将时间戳放在开头(前面),而不是放在结尾(后面):

from datetime import datetime as dt 

old_out = sys.stdout

class StAmpedOut:
  """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 = StAmpedOut()
28

因为你不能直接修改 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]

撰写回答