为什么Python文档建议不要针对常规控制台输出使用日志记录?

时间:2019-10-22 20:07:41

标签: python logging console-application

在Python docs on logging中,它表示“ Display [ing]控制台输出以用于命令行脚本或程序的常规使用”的“ 最适合任务的工具” < / em>”将使用print()函数。

我不明白为什么。背后的原因是什么?

我想在项目中系统地使用日志记录,这是一个命令行工具,向控制台提供一些标准输出。通常由print()生成的所有标准输出也应转到日志文件。

对于我的root记录器,我既使用StreamHandler进行控制台输出,也使用FileHandler生成日志文件。如果要遵循建议,则必须使用相同的日志记录语句复制每个打印语句,或者按照this question中的建议找到一种方法来重定向print()的输出。那里接受的答案是通过编写print = log.info来代替打印功能,这实际上等于将日志记录为普通控制台输出。

3 个答案:

答案 0 :(得分:2)

与简单打印相比,日志记录更加耗费资源和时间。如果您只想获取控制台输出,请使用print。但是,您还想将所有输出记录到文件中,这就是为什么要使用logging的原因。

如果要同时打印到控制台和保存到日志,则可以在每次要执行的操作中都放入这两个命令,可以创建一个自定义函数来分别执行这两项操作,或者创建StreamHandler和像您提到的FileHandler会将日志发送到stdout。您可以按照this answer为例。

答案 1 :(得分:1)

如果要记录某些内容,则要记录一些内容。如果要在stdout上输出数据,则要打印一些内容。有时一个人伪装成另一个,但它们本质上是不同的。

如果创建的命令行应用程序从stdin读取并输出到stdout,则表示正在打印。如果您正在编写有关正在进行的某些过程的信息,警告或错误更新,则表示正在登录。

  

我想在项目中系统地使用日志记录

然后系统地记录日志,而不是系统地打印。

  

通常由print()生成的所有标准输出也应转到日志文件。

那么这些不应该是打印呼叫,而应该是日志呼叫。

我认为您链接的问题包含错误的建议。您应该使用常规的日志记录调用并设置记录器,以使其既输出到控制台,又输出到日志文件。

答案 2 :(得分:0)

我真的觉得您对文档中的建议读得太多了。或者,换一种方式来看,我认为您对Python社区给予了太多赞誉,因为他们不是需要被告知他们不应该做愚蠢的事情。

当他们这样说时:

您要执行的任务:显示控制台输出,以供命令行脚本或程序的常规使用
完成任务的最佳工具print()

他们的意思是 ,不要做这样的蠢事:

  1. 编写grep的Python实现,该实现使用logging.log()显示匹配的行
  2. 编写一个git log,将提交历史记录显示为一系列log()消息
  3. units转换结果的方式重新实现log()

因为,尽管有这种友好的劝阻,人们 绝对会! 甚至还有拥有。只是……希望比以前少得多。

如果程序的输出确实是 记录,而不是程序的结果运行,则请务必使用{{1 }}!根据这些建议,您不是与他们交谈的人之一。