在Python打印中添加时间戳
我正在调试一个我依赖的大型库的行为,这个库在很多源文件中使用了大量的调试打印语句。问题是,这些调试打印语句几乎都没有日期/时间戳,所以很难把应用层的故障和库代码中的故障联系起来。
我不想修改所有可能与我看到的故障有关的调试打印的源代码,所以我想是否可以临时修改内置的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]