Python日志是否可以替代print输出?

10

到目前为止,我一直在我的代码中使用 'if VERBOSE: print debug message'。后来我学会了如何使用logging模块。它似乎可以做我可能需要的一切,甚至更多。我太过于兴奋了,用logging语句替换了我的代码中所有print语句,而不仅仅是冗长的那些。

这是一个错误吗?如果我已经在使用logging,我可以在所有情况下都使用它来替代print吗?如果不能,我该如何选择使用loggingprint

5个回答

8

print 命令用于输出对程序运行至关重要的信息。而 logging 则用于输出对程序运行有帮助但不影响程序可用性的信息,如错误信息、进度等。

基本日志教程 中讨论了何时使用 logging 以及其他机制。


3
Python 3 的同一教程链接 - https://docs.python.org/3/howto/logging.html - Major Major

3
有人说日志记录是为了你软件的操作者。这意味着需要纠正经常出现的错误或在运行时告知软件状态的人们。
可以这样说,打印是为你软件的用户。这意味着那些对运行结果感兴趣的人。如果出现错误,他们无法进行更正,只能忽略它或完全停止使用你的软件。
因此,传统上,日志记录会写入stderr,而打印则会写入stdout。
因此,日志记录不应完全取代打印,因为每个都面向不同的受众。您可以滥用它以完全替换打印(例如通过使用连接到stderr和stdout的不同处理程序并具有不同级别的处理程序),但这与以前滥用打印语句进行日志记录的方式相同。
顺便说一下,有时将print语句误用于调试称为穴居人日志记录。欢迎走出洞穴! :)

1
Python日志记录可以完全替代您的打印语句。您只需要更多的选项。 日志记录的默认配置像print一样写入控制台,但您可以以其他方式使用日志记录,例如写入日志记录服务器,重新格式化输出,添加信息(例如来自哪个模块的行或时间)。

0

还有一件需要考虑的事情是,如果您拥有需要高速运行的代码。或者,如果您正在打印某些内容,并且在极少数情况下格式可能会发生变化,例如如通信中断或出现错误等。

请考虑以下2个选项:

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语句。

并且作为一般规则,最终用户应该看到的内容应该是“print”。


0

logging 可能会完全替代您的 print() 调用。在某些情况下,例如开发库或使用多个线程时,日志记录是更好的选择。

没有硬性规定。个人倾向于不混合使用日志记录和打印,并且只使用其中之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接