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

Sam*_*dio 66 python printing logging

对于复杂项目中的简单调试,是否有理由使用python记录器而不是print?其他用例怎么样?是否有一个被接受的最佳用例(特别是当你只是在寻找标准输出时)?

我一直听说这是一个"最佳实践",但我无法弄清楚原因.

小智 75

日志包具有许多有用的功能:

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

打印没有这些.

此外,如果你的项目是由其他python工具导入的,那么你的软件包将东西打印到stdout是不好的做法,因为用户可能不知道打印消息的来源.通过日志记录,您的软件包的用户可以选择是否要从您的工具传播日志消息.

  • 1.我确切地知道打印语句在哪里,因为我通常将它写在我要调试的特定位置。2. 记录到文件和套接字?如果我只是在编码时调试自己的代码,我不明白为什么我想要登录到这些地方。3.可以根据严重程度进行区分。好吧,当我使用 print 时,它通常是我感兴趣的一个特定错误。总之,对于调试我自己的代码, print 对我来说就足够了。我偶尔会使用调试器,但在编码时似乎没有必要使用日志记录。 (3认同)
  • 说得好。在调试我打算只运行一次的一次性脚本时,我有时会使用 print,但是任何其他人眼见过的或打算持续一天以上的代码都会被记录器记录下来。 (2认同)

rid*_*rid 19

正确记录的最大优点之一是您可以根据需要对消息进行分类并打开或关闭它们.例如,为项目的某个部分打开调试级别消息可能很有用,但是为其他部分调低调整级别,以免被信息过载接管并轻松专注于您需要的任务日志记录.

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

  • 绝对+1用于将输出发送到文件.在事后验证中解析日志文件要比在打开的控制台窗口中再次中断以查找错误要好得多.基本上,记录器非常适合在脚本出现故障后调试脚本而不是失败时.它也是您必须调试需要分析程序输出的复杂问题的理想选择.基本上,每当你处理错误更复杂的语法错误时,记录器可能会为你简化. (3认同)

Sin*_*ion 8

打印语句是两个世界中最糟糕的,将在线调试器的负面影响与诊断仪器相结合.您必须修改程序,但不会从中获得更多有用的代码.

在线调试器允许您检查正在运行的程序的状态; 但真正的调试器的好处是你不必修改源代码; 调试会话之前和之后都没有; 您只需将程序加载到调试器中,告诉调试器您要查看的位置,并且您已完成设置.

检测应用程序可能需要预先做一些工作,以某种方式修改源代码,但生成的诊断输出可能具有大量细节,并且可以在非常特定的程度上打开或关闭.python日志记录模块不仅可以显示记录的消息,还可以显示调用它的文件和函数,如果有的话,还可以显示消息的实际发送时间,等等.比那更多的; 永远不要删除诊断仪器; 当程序完成并且在生产中它就像它被添加的那一天一样有效和有用; 但它可以将它的输出卡在日志文件中,它不会惹恼任何人,或者可以调低日志级别以保留除最紧急消息之外的所有消息.

预测调试器的需要或使用并不比在测试时使用ipython更难,并且熟悉它用来控制内置pdb调试器的命令.

当你发现自己认为print语句可能比使用pdb更容易时(通常是这样),你会发现使用记录器会比你使用和以后删除print语句更容易处理你的程序状态. .

我的编辑器配置为将print语句突出显示为语法错误,并将语句记录为注释,因为这是关于我如何看待它们的.


Ben*_*ari 7

简而言之,使用日志库的优势确实超过print以下原因:

\n
    \n
  • 控制\xe2\x80\x99s 发出的内容
  • \n
  • 定义您想要在日志中包含哪些类型的信息
  • \n
  • 配置\xe2\x80\x99s 发出时的外观
  • \n
  • 最重要的是,设置日志的目的地
  • \n
\n
\n

具体来说,按严重性级别对日志事件进行分段是筛选哪些日志消息在给定时间可能最相关的好方法。日志事件\xe2\x80\x99s 严重性级别还可以指示您在看到特定消息时应该有多担心。例如,将日志记录类型分为debuginfowarningcriticalerror。当您\xe2\x80\x99 试图了解应用程序出了什么问题时,时间就是一切。您想知道以下问题的答案:

\n
    \n
  • \xe2\x80\x9c这是在我的数据库连接断开之前还是之后发生的?\xe2\x80\x9d
  • \n
  • \xe2\x80\x9c这个请求到底是什么时候进来的?\xe2\x80\x9d
  • \n
\n

此外,通过行号和文件名或方法名,甚至在哪个线程中,都可以很容易地看到日志发生在哪里。

\n
\n

这是一个名为loguru的 Python 功能日志库。

\n


Ign*_*ams 5

如果您使用日志记录,那么负责部署的人员可以配置记录器以将其发送到自定义位置以及自定义信息。如果你只打印,那么他们就只能得到这些。