将打印重定向到日志文件
好的,我完成了我的第一个Python程序,差不多有1000行代码。在开发过程中,我在使用os.system()
运行命令之前,放了很多print
语句,像这样:
print "running command",cmd
os.system(cmd)
现在我已经完成了这个程序。我考虑过把这些语句注释掉,但我觉得把这些不必要的打印信息(我不能删掉所有的print
语句,因为有些是给用户提供有用信息的)重定向到一个日志文件里会更有用。有没有什么技巧或者建议呢?
10 个回答
12
下次,如果你一开始就使用
logging
模块,而不是到处使用print
语句,你会更开心。这个模块能给你想要的控制,而且你可以让它把信息写到标准输出(stdout),这样就能满足你的需求。这里很多人建议重定向标准输出。这个方法很糟糕。 它会改变一个全局变量,更糟的是,它只为这个模块改变。与其这样,我宁愿写个正则表达式,把所有的
print foo
改成print >>my_file, foo
,然后把my_file
设置为标准输出或我选择的实际文件。- 如果你的应用程序中有其他部分真的依赖于写入标准输出(或者将来可能会依赖,但你现在还不知道),那么这样做会破坏它们。即使没有,这样也会让你的模块看起来像是做一件事,实际上却在做另一件事,如果你上面漏掉了一行代码。
- 使用重定向的打印方式虽然不好看,但比临时改变
sys.stdout
要好得多。 - 从技术上讲,正则替换并不能完全正确地做到这一点(例如,如果你在多行字符串中,它可能会产生错误的匹配)。不过,它可能会有效,只要留意一下就行。
os.system
几乎总是比使用subprocess
模块要差。后者不需要调用 shell,不会以通常不希望的方式传递信号,而且可以以非阻塞的方式使用。
66
你可以看看这个Python的日志模块。
补充说明:下面是一个示例代码:
import logging
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+",
format="%(asctime)-15s %(levelname)-8s %(message)s")
logging.info("hello")
这个代码会生成一个名为“logfile”的文件,里面的内容是:
2012-10-18 06:40:03,582 INFO hello
72
Python 允许你捕获并赋值给 sys.stdout,正如之前提到的,来实现这个功能:
import sys
old_stdout = sys.stdout
log_file = open("message.log","w")
sys.stdout = log_file
print "this will be written to message.log"
sys.stdout = old_stdout
log_file.close()