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

Why do Python docs recommend against using logging for normal console output?

在 Python docs on logging 中它说 任务的最佳工具 " "Display[ing] console output for ordinary usage of a command line script or program" 是使用 print() 函数。

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

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

对于我的根记录器,我使用 StreamHandler 进行控制台输出,并使用 FileHandler 生成日志文件。如果我想遵循建议,我必须使用相同的日志语句复制每个打印语句,或者找到一种方法来重定向 print() 的输出,如 this question 中所建议的那样。接受的答案是通过编写 print = log.info 来替换打印功能,毕竟这实际上相当于对普通控制台输出使用日志记录。

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

如果您想同时打印到控制台和保存到日志,您可以在每次执行此操作时都输入这两个命令,创建一个自定义函数来分别执行这两项操作,或者创建一个 StreamHandlerFileHandler 就像你提到的将你的日志发送到标准输出。您可以按照 this answer 举个例子。

如果你想记录一些东西,你想记录一些东西。如果你想在 stdout 上输出数据,你想要打印一些东西。有时一个伪装成另一个,但它们根本不同。

如果您正在创建一个从标准输入读取并输出到标准输出的命令行应用程序,那么您就是在打印。如果您正在编写有关某些正在进行的进程的信息、警告或错误更新,那么您就是在记录日志。

I want to use logging systematically in my project

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

All standard output normally generated by print() should also go to the log file.

那么这些不应该是打印调用,而是记录调用。

我认为您链接的问题包含不好的建议。您应该使用常规日志记录调用并设置您的记录器,使其同时输出到控制台和日志文件。

我真的觉得您对文档中的警告读得太多了。或者,换个角度来看,我认为你给了 Python 社区太多的信任,因为 not 不需要被告知他们不应该做愚蠢的事情。

当他们这样说时:

Task you want to perform: Display console output for ordinary usage of a command line script or program
The best tool for the task: print()

他们的意思是,不要做这样的白痴事情:

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

因为人们绝对会!而且可能,尽管有友好的劝阻。只是......希望比他们本来的频率要低。

如果您的程序的输出确实是logging,而不是程序的结果 运行,那就一定要用logging!有了这个建议,你不是他们正在与之交谈的人之一。