到目前为止,我一直peppering my code使用“if VERBOSE: print debug message
”。然后我学会了如何使用logging
模块。它看起来好像做了我想要的一切,然后是一些。这么多,以至于我被带走并用print
语句替换了代码中的所有 logging
语句,而不仅仅是冗长的语句。
这是一个错误吗?如果我已经在使用logging
,我是否可以使用它以各种方式替换print
?如果没有,我该如何选择是使用logging
还是print
?
答案 0 :(得分:4)
print
仍将用于对程序操作至关重要的输出。 logging
用于输出,可能有助于确定程序的工作方式(错误,进度等),但可以在不影响程序可用性的情况下省略。
Basic Logging Tutorial讨论何时使用logging
与其他机制。
答案 1 :(得分:1)
Python日志记录可以完全替换您的print语句。你有更多的选择。 日志记录的默认配置在打印时写入控制台,但您可以通过其他方式使用日志记录,例如写入日志记录服务器,重新格式化输出,添加行来自的模块或时间等信息。
答案 2 :(得分:1)
有人说日志记录适用于您软件的运营商。这意味着,需要纠正重复出错的人,或者在运行时告诉正在运行的软件的状态。
然后可以说打印是针对您软件的用户。这意味着那些对运行软件的结果感兴趣的人。如果出现错误,他们无法纠正错误,因此他们只能忽略它,或者完全停止使用您的软件。
这就是为什么传统上,日志记录转到stderr
,而打印转到stdout
。
因此,记录不应该完全取代打印,因为每个打印都是针对不同的受众。您可以滥用它来完全替换打印(例如,使用不同级别附加到stderr
和stdout
的不同处理程序),但这会误用同一个日志系统在你滥用打印语句进行记录之前的方式。
顺便说一句,误用print
语句进行调试有时称为Caveman logging。欢迎来到洞外! :)
答案 3 :(得分:1)
另一件需要考虑的事情是,如果你有代码,速度是一个问题。或者,如果您要打印的格式可能会在罕见的极端情况下发生变化,例如说如果通信丢失或发生错误。
考虑以下两个选项:
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语句。
而且作为一般规则,最终用户应该看到的内容应该是“打印”。
答案 4 :(得分:0)
logging
可能会也可能不会完全取代您的print()
来电。在某些情况下,比如开发库或使用多线程日志记录是更好的选择。
没有严格的规定。就个人而言,我倾向于不混合使用日志和打印并使用其中一种。