我一直听说这是一种“最佳实践”,但我一直没有弄清楚为什么。
日志记录包具有许多有用的功能:
打印功能没有这些功能。
此外,如果您的项目旨在被其他Python工具导入,那么将内容打印到标准输出(stdout)是一个不好的做法,因为用户很可能不知道打印消息来自哪里。使用日志记录,您的包的用户可以选择是否要传播来自您的工具的日志消息。
正确记录日志的最大优势之一是,您可以将消息分类并根据需要打开或关闭它们。例如,在项目的某个特定部分打开调试级别的消息可能很有用,但对于其他部分则可能会降低其重要性,因此不会被信息过载所占领,并且更容易集中精力完成需要记录日志的任务。
此外,日志是可配置的。您可以轻松地对其进行过滤、发送到文件、格式化、添加时间戳以及任何其他全局需求。而使用print语句就无法方便地进行管理。
打印语句有点像将在线调试器的负面方面与诊断工具结合在一起,既需要修改程序,但并不能从中获得更多有用的代码。
在线调试器允许您检查运行中程序的状态;但真正调试器的好处在于您无需修改源代码,在调试会话之前或之后都不需要;您只需将程序加载到调试器中,告诉调试器您要查看哪些内容,然后就可以开始了。
应用程序诊断可能需要一些前期工作,以某种方式修改源代码,但生成的诊断输出可以具有巨大的详细信息,并且可以按非常特定的程度开启或关闭。Python日志记录模块不仅可以显示已记录的消息,还可以显示调用它的文件和函数、如果有的话则为回溯,实际发出消息的时间等等。此外,诊断工具永远不需要被移除;当程序完成并投入生产时,它与添加的那天一样有效和有用;但它的输出可以被粘贴到日志文件中,这不太可能会干扰任何人,或者日志级别可以降低以使除最紧急的消息外所有消息都不会被记录。
预见调试的需要或使用实际上并不比在测试时使用ipython并熟悉其用于控制内置pdb调试器的命令更难。
当您发现自己认为使用打印语句比使用pdb更容易时(通常情况下),您会发现使用日志记录器可以使您的程序处于更易于处理状态,而不是使用并随后删除打印语句。
我将我的编辑器配置为将打印语句突出显示为语法错误,将日志记录声明突出显示为注释,因为我认为它们就像注释一样。
print
,原因如下:
如果您使用日志记录,那么负责部署的人员可以配置记录器将其发送到自定义位置,并提供自定义信息。如果只是打印,则只能获得这些内容。
tail -f mylogfile.log | egrep "key_word1|key_word2"
除了提到的其他优点外,我想补充一下,在标准配置中,打印函数是有缓冲区的。刷新只会在当前块(包含打印命令的块)的末尾发生。
对于任何在非交互式 shell 中启动的程序(例如 codebuild、gitlab-ci)或其输出被重定向的程序而言,情况都是如此。
如果由于某种原因程序被终止(kill -9、计算机硬重置等),那么如果你使用 print 命令,你可能会错过一些日志信息。
然而,日志库将确保立即刷新打印到 stderr 和 stdout 的日志信息。
print("hello world", flush=True)
。 - Jason
print
从来没有最好的使用场景。 - SingleNegationEliminationprint
最佳使用场景是在命令行应用程序中显示用户帮助信息。 - slushy