在python中,为什么要使用日志记录而不是print?


96

对于复杂项目中的简单调试,是否有理由使用python记录器而不是print?那其他用例呢?是否每个都有一个公认的最佳用例(尤其是在您仅查找标准输出时)?

我一直都听说这是“最佳实践”,但我一直无法弄清原因。


4
对于大型项目,日志记录始终是“最佳实践”,因为您可以轻松打开或关闭日志记录,或者获取或多或少的信息。打印没有提供这些优点。
克里斯·


3
我认为永远没有最好的用例print
SingleNegationElimination

5
蟒蛇日志文件 说,最好的用例print是在命令行应用程序的用户显示帮助信息。
肮脏的

阅读所有这些答案后,我想问一个相反的问题:是否有理由使用日志记录?
information_interchange

Answers:


105

日志记录程序包具有许多有用的功能:

  • 易于查看从何处以及何时(即使是哪一行)进行记录调用。
  • 您可以同时登录文件,套接字,几乎所有内容。
  • 您可以根据严重性区分日志记录。

印刷没有这些。

另外,如果您的项目打算由其他python工具导入,则对于您的包来说,将内容打印到stdout是不好的做法,因为用户很可能不知道打印消息的来源。使用日志记录,包的用户可以选择是否要传播您工具中的日志记录消息。


2
说得好。在调试我打算只运行一次的一次性脚本时,有时会使用print,但是其他人眼所见或打算持续一天以上的任何代码都会得到记录器。
TimothyAWiseman

23

正确记录的最大优点之一是您可以对消息进行分类,然后根据需要将其打开或关闭。例如,为项目的某个部分打开调试级别的消息,而为其他部分调低调试级别的消息,这样可能会很有用,以免被信息过载所取代,并轻松地专注于您需要执行的任务记录。

另外,日志是可配置的。您可以轻松地对其进行过滤,将其发送到文件,对其进行格式化,添加时间戳以及在全球范围内可能需要的任何其他事项。打印报表不容易管理。


3
绝对+1,用于将输出发送到文件。在验尸中解析日志文件比使它在打开的控制台窗口中再次中断以查找错误要好得多。基本上,记录器是您需要在脚本失败后(而不是在失败时)调试的任何时间的理想选择。对于需要调试需要分析程序输出的复杂问题的任何时间,它也是理想的选择。基本上,每当您处理的语法错误比语法错误更复杂时,记录器都可能会为您简化操作。
乔纳森(Jonathanb)

11

打印语句将在线调试器的负面影响与诊断工具结合在一起,是两全其美的方式。您必须修改程序,但无法从中获得更多有用的代码

在线调试器使您可以检查正在运行的程序的状态。但是真正的调试器的好处是您不必修改源代码。调试会话之前或之后;您只需将程序加载到调试器中,告诉调试器您要查找的位置,便一切就绪。

对应用程序进行检测可能需要先进行一些工作,以某种方式修改源代码,但是生成的诊断输出可能具有大量详细信息,并且可以在非常特定的程度上打开或关闭。python日志记录模块不仅可以显示记录的消息,还可以显示调用该消息的文件和函数,是否有回溯,是否发出了消息的实际时间等等。比那更多的; 诊断仪器永远不需要拆除;当程序完成并投入生产时,它与添加之日一样有效和有用。但是它可以将其输出卡在一个日志文件中,在该文件中它不会惹恼任何人,或者可以将日志级别调低以将所有最紧急的消息拒之门外。

真正比在测试时使用ipython更加容易,并且可以预测调试器的需求或用途,并且熟悉其用于控制​​内置pdb调试器的命令。

当您发现自己认为打印语句可能比使用pdb容易(通常如此)时,您会发现使用记录器比使用并随后删除打印语句更容易使程序处于工作状态。 。

我将编辑器配置为突出显示打印语句为语法错误,并将记录语句突出为注释,因为这就是我如何看待它们。



1

日志记录实质上会创建一个具有其他元数据(时间戳,日志级别,行号,进程等)的可打印输出的可搜索纯文本数据库。

这是纯金,我可以在python脚本运行在日志文件上运行egrep 。我可以调整egrep模式搜索以准确选择我感兴趣的内容,而忽略其余内容。认知负担的减少和以后通过反复试验选择我的egrep模式的自由是我的主要好处。

tail -f mylogfile.log | egrep "key_word1|key_word2"

现在,抛出其他打印无法完成的很棒的事情(发送至套接字,设置调试级别,logrotate,添加元数据等),您有充分的理由偏爱于记录普通打印语句。

我倾向于使用打印语句,因为它既懒惰又容易,添加日志记录需要一些样板代码,嘿,我们有yasnippets(emacs)和ultisnips(vim)以及其他模板工具,所以为什么要放弃对普通打印语句的记录!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.