Python的日志能替代print吗?
到目前为止,我一直在我的代码里到处加上'if VERBOSE: print debug message
'这样的调试信息。后来我学会了使用logging
模块。这个模块看起来能做我想要的一切,甚至更多。结果我有点过头了,把我代码里的所有print
语句都换成了logging
语句,而不仅仅是那些详细的调试信息。
这样做是个错误吗?如果我已经在用logging
,那我能不能用它来替代所有的print
?如果不能,我该如何选择使用logging
还是print
呢?
5 个回答
logging
可能会完全取代你使用的 print()
调用,也可能不会。在某些情况下,比如开发一个库或者使用多个线程时,使用 logging
是更好的选择。
这方面没有严格的规定。就我个人而言,我通常不把 logging
和 print()
混在一起用,而是选择其中一个来使用。
还有一个需要考虑的事情是,如果你的代码对速度要求比较高,或者你在打印一些内容时,格式可能会在一些特殊情况下发生变化,比如说通信中断或者出现错误。
可以考虑这两个选项:
msg = "Parameters are: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f"%(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7])
logger.debug(msg)
或者
if VERBOSE:
msg = "Parameters are: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f"%(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7])
print msg
在第一个情况下,即使日志级别不是DEBUG,字符串格式化仍然会进行,这会影响整体性能。而在第二种情况下,如果VERBOSE是False,就什么都不会发生。
另外,我也遇到过因为调试信息的字符串格式化而产生异常的情况。比如在上面的代码中,如果“p”只有6个值,就会出现索引错误。或者如果其中一个p的值是“None”,你也会遇到异常。但是在第二种情况下,如果VERBOSE是False,你就不会看到因为调试代码而导致的崩溃。
所以,日志记录非常有用,但我通常只在需要将信息作为永久代码特性时使用它。如果我需要放一个临时信息来帮助调试一次性的问题,我通常会使用打印语句。
还有一个一般性的规则,最终用户应该看到的内容应该用“print”来输出。
Python的日志功能可以完全取代你用来调试的print语句。使用日志,你有更多的选择。默认情况下,日志会像print一样把信息输出到控制台,但你还可以用日志做其他事情,比如把信息写入一个日志服务器、重新格式化输出内容、添加一些额外的信息,比如这行代码来自哪个模块或者发生的时间。
有些人认为,记录日志是为了软件的操作员。也就是说,那些需要修复重复出现的错误,或者想知道软件在运行时状态的人。
而打印信息则是为了软件的用户。这些人关心的是运行软件的结果。如果出现错误,他们无法修复,只能选择忽略,或者干脆不再使用你的软件。
因此,传统上,日志记录会发送到stderr
,而打印信息则发送到stdout
。
所以,记录日志不应该完全替代打印,因为它们是针对不同的受众。你可以错误地使用日志来完全替代打印(比如通过使用不同的处理程序,将信息发送到stderr
和stdout
,并设置不同的级别),但这就像之前你错误地使用打印语句来记录日志一样。
顺便提一下,错误地使用print
语句进行调试,有时被称为穴居人日志。欢迎走出洞穴!:)
print
仍然会用于输出那些对你程序运行至关重要的信息。而 logging
则是用来输出一些可能对了解你程序运行情况有帮助的信息(比如错误、进度等),但这些信息如果不显示也不会影响你程序的使用。
基础日志记录教程 讲解了何时应该使用 logging
而不是其他输出方式。