python日志是否取代了打印?
到目前为止,我一直在使用“python日志是否取代了打印?,python,logging,Python,Logging,到目前为止,我一直在使用“if VERBOSE:print debug message”。然后我学习了如何使用该模块。它看起来好像做了我可能想要的一切,然后一些。如此之多,以至于我被冲昏头脑,将代码中的所有print语句替换为logging语句,而不仅仅是冗长的语句 这是个错误吗?如果我已经在使用日志记录,我可以用它以各种方式替换打印?如果没有,我如何选择是使用日志记录还是打印?打印仍将用于对程序运行至关重要的输出日志记录用于输出可能有助于确定程序的工作方式(错误、进度等),但可以在不影响程序可
if VERBOSE:print debug message
”。然后我学习了如何使用该模块。它看起来好像做了我可能想要的一切,然后一些。如此之多,以至于我被冲昏头脑,将代码中的所有print
语句替换为logging
语句,而不仅仅是冗长的语句
这是个错误吗?如果我已经在使用
日志记录
,我可以用它以各种方式替换打印
?如果没有,我如何选择是使用日志记录
还是打印
?打印
仍将用于对程序运行至关重要的输出<代码>日志记录用于输出可能有助于确定程序的工作方式(错误、进度等),但可以在不影响程序可用性的情况下省略
讨论了何时使用
日志记录
与其他机制。Python日志记录可以完全取代打印语句。你只是有更多的选择。
日志记录的默认配置会像打印一样写入控制台,但您可以通过其他方式使用日志记录,如写入日志记录服务器、重新格式化输出、添加诸如线路来源模块或时间之类的信息。有人说日志记录是为您的软件操作员准备的。这意味着,需要纠正反复出现的错误,或者在软件运行时告诉软件运行状态的人 可以说,打印是为软件用户准备的。这意味着,那些对运行您的软件的结果感兴趣的人。如果有错误,他们无法纠正,因此他们只能忽略它,或者完全停止使用您的软件 这就是为什么传统上,日志记录转到
stderr
,而打印转到stdout
因此,日志不应完全取代打印,因为每个日志都是针对不同的受众的。可以误用它来完全替代打印(例如,通过使用附加到不同级别的stderr
和stdout
的不同处理程序),但这是以与之前误用打印语句进行日志记录相同的方式误用日志记录系统
顺便提一下,有时会调用误用
print
语句进行调试。欢迎来到洞穴外!:)要考虑的另一件事是,如果你有一个代码,其中速度是一个问题。或者,如果您正在打印一些格式可能会在极少数情况下发生更改的内容,例如,如果通信丢失或发生错误
考虑以下两个选项:
msg = "Parameters are: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f"%(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7])
logger.debug(msg)
或
在第一种情况下,即使日志记录级别不是DEBUG,字符串格式化仍在进行中,这将影响总体性能。在第二种情况下,如果VERBOSE为False,则不会执行任何操作
此外,在调试消息的字符串格式生成异常的情况下,我也遇到了麻烦。以上面的代码为例,如果有一个罕见的用例,其中“p”只有6个值,那么您将得到一个索引错误。或者,如果其中一个p值为“无”,则会出现异常。但是在第二种情况下,如果VERBOSE为False,您将永远不会看到调试代码导致的崩溃
因此,日志记录非常方便,但我倾向于仅在希望将消息作为永久代码功能的情况下使用它。如果我需要输入一条临时消息来帮助调试一次性问题,我通常只使用print语句
同样作为一般规则,最终用户要看到的内容应该是“打印”。
日志记录可能会也可能不会完全取代您的print()
调用。在某些情况下,例如在开发库或使用多线程时,日志记录是更好的选择
这方面没有硬性规定。就我个人而言,我倾向于不将日志记录和打印混合使用,而是使用其中之一。链接到Python 3的同一教程-
if VERBOSE:
msg = "Parameters are: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f"%(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7])
print msg