对于复杂项目中的简单调试,是否有理由使用python记录器而不是print?其他用例怎么样?是否有一个被接受的最佳用例(特别是当你只是在寻找stdout时)?
我一直听说这是“最佳做法”,但我无法弄清楚原因。
答案 0 :(得分:66)
日志包具有许多有用的功能:
打印没有这些。
此外,如果您的项目是由其他python工具导入的,那么您的软件包将内容打印到stdout是不好的做法,因为用户可能无法知道打印消息的来源从。通过日志记录,您的软件包的用户可以选择是否要从您的工具传播日志消息。
答案 1 :(得分:19)
正确记录的最大优势之一是您可以根据需要对消息进行分类并打开或关闭它们。例如,为项目的某个部分打开调试级别消息可能很有用,但是为其他部分调低调整级别,以免被信息过载接管并轻松专注于您需要的任务日志记录。
此外,日志是可配置的。您可以轻松地过滤它们,将它们发送到文件,格式化它们,添加时间戳以及全球范围内可能需要的任何其他内容。打印报表不易管理。
答案 2 :(得分:8)
打印语句是两个世界中最糟糕的,将在线调试器的负面影响与诊断工具相结合。您必须修改程序,但不会从中获取更多,有用的代码。
在线调试器允许您检查正在运行的程序的状态;但真正的调试器的好处是你不必修改源代码;调试会话之前和之后都没有;您只需将程序加载到调试器中,告诉调试器您要查看的位置,并且您已完成设置。
检测应用程序可能需要预先做一些工作,以某种方式修改源代码,但生成的诊断输出可能具有大量细节,并且可以在非常特定的程度上打开或关闭。 python日志记录模块不仅可以显示记录的消息,还可以显示调用它的文件和函数,如果有的则返回跟踪,消息发出的实际时间等等。比那更多的;诊断仪器需要从不被删除;当程序完成并且在生产中它就像它被添加的那一天一样有效和有用;但它可以将它的输出卡在日志文件中,它不会惹恼任何人,或者可以调低日志级别以保留除最紧急消息之外的所有消息。
预测调试器的需要或使用并不比在测试时使用ipython更难,并且熟悉它用来控制内置pdb调试器的命令。
当你发现自己认为打印语句可能比使用pdb更容易时(通常是这样),你会发现使用记录器可以比你以后使用更方便的工作状态删除打印语句。
我的编辑器配置为将打印语句突出显示为语法错误,并将语句记录为注释,因为这是关于我如何看待它们。
答案 3 :(得分:4)
如果您使用日志记录,则负责部署的人员可以将记录器配置为使用自定义信息将其发送到自定义位置。如果你只打印,那就是他们得到的全部。
答案 4 :(得分:0)
从本质上讲,日志记录会创建一个可打印的打印输出以及其他元数据(时间戳,日志级别,行号,进程等)的纯文本数据库。
这是纯金,在python脚本运行后,我可以在日志文件上运行egrep。 我可以调整egrep模式搜索以准确选择我感兴趣的内容,而忽略其余内容。认知负担的减少和以后通过反复试验选择我的egrep模式的自由是我的主要好处。
tail -f mylogfile.log | egrep "key_word1|key_word2"
现在添加打印无法完成的其他出色功能(发送至套接字,设置调试级别,logrotate,添加元数据等),您有理由偏爱使用普通打印语句而不是普通打印语句。
我倾向于使用打印语句,因为它既懒惰又容易,添加日志记录需要一些样板代码,嘿,我们有yasnippets(emacs)和ultisnips(vim)以及其他模板工具,所以为什么要放弃对普通打印语句的记录! ?
答案 5 :(得分:0)
简而言之,使用日志库的优势确实超过了 print
,原因如下:
详细而言,按严重性级别对日志事件进行分段是筛选在给定时间可能最相关的日志消息的好方法。日志事件的严重性级别还可以指示您在看到特定消息时应该有多担心。例如,将日志类型划分为调试、信息、警告、严重和错误强>。当您试图了解应用程序出了什么问题时,时间就是一切。您想知道以下问题的答案:
此外,即使在哪个线程中,也可以通过行号和文件名或方法名轻松查看日志发生的位置。
这是一个名为 loguru 的 Python 功能日志库。