在Python中,为什么使用日志而不是打印?

为了在复杂的项目中进行简单的debugging,是否有理由使用python logger而不是print? 那么其他用例呢? 是否有一个公认的最好的用例(尤其是当你只是在寻找标准输出)?

我一直听说这是一个“最佳做法”,但我还没有弄清楚为什么。

日志logging包有很多有用的function:

  • 很容易看到正在进行日志调用的地点和时间(甚至是线路号)。
  • 您可以同时login文件,套接字,几乎任何东西。
  • 您可以根据严重性区分您的日志logging。

打印没有任何这些。

另外,如果你的项目是由其他python工具导入的,那么你的包打印标准输出是个不好的习惯,因为用户可能不知道打印信息来自哪里。 通过日志logging,您的软件包的用户可以select是否要从工具传播日志消息。

正确logging的最大优点之一就是可以对消息进行分类,并根据需要将其打开或closures。 例如,为项目的某个部分打开debugging级别的消息可能是有用的,但为其他部分调低级别消息可能是有用的,以免被信息过载占用,并容易集中于您需要的任务日志logging。

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

打印语句是两个世界中最糟糕的 ,将在线debugging器的负面方面与诊断仪器相结合。 你必须修改程序,但是你没有从中得到更多有用的代码

在线debugging器允许您检查正在运行的程序的状态; 但是真正的debugging器的好处在于你不必修改源代码; 在debugging会话之前和之后都没有; 您只需将程序加载到debugging器中,告诉debugging器您想要查看的位置,然后全部设置好。

对应用程序进行testing可能需要一些工作,以某种方式修改源代码,但生成的诊断输出可能包含大量的细节,并且可以打开或closures到非常特定的程度。 Python日志logging模块不仅可以显示logging的消息,还可以显示调用该消息的文件和函数,如果有的话还会回溯,发送消息的实际时间等等。 比那更多的; 诊断仪器不需要移除; 当程序完成和生产时,它就像它被添加的那天一样有效和有用; 但是它可以将输出停留在一个日志文件中,而不会让任何人感到困扰,或者可以closures日志级别来保留除最紧急的消息外的所有日志文件。

预测debugging器的需求或用途实际上并不比在testing时使用ipython更困难,并熟悉它用于控制内置pdbdebugging器的命令。

当你发现自己认为打印语句可能比使用pdb更容易(就像往常一样),你会发现使用logging器可以使你的程序比使用打印语句更容易处理状态。

我configuration了我的编辑器,将打印语句突出显示为语法错误 ,并将语句logging为注释,因为这涉及我如何看待它们。

如果使用日志logging,那么负责部署的人员可以configurationlogging器,将其发送到具有自定义信息的自定义位置。 如果你只打印,那就是他们得到的。