Python的日志能替代print吗?

10 投票
5 回答
8882 浏览
提问于 2025-04-30 16:08

到目前为止,我一直在我的代码里到处加上'if VERBOSE: print debug message'这样的调试信息。后来我学会了使用logging模块。这个模块看起来能做我想要的一切,甚至更多。结果我有点过头了,把我代码里的所有print语句都换成了logging语句,而不仅仅是那些详细的调试信息。

这样做是个错误吗?如果我已经在用logging,那我能不能用它来替代所有的print?如果不能,我该如何选择使用logging还是print呢?

暂无标签

5 个回答

0

logging 可能会完全取代你使用的 print() 调用,也可能不会。在某些情况下,比如开发一个库或者使用多个线程时,使用 logging 是更好的选择。

这方面没有严格的规定。就我个人而言,我通常不把 loggingprint() 混在一起用,而是选择其中一个来使用。

0

还有一个需要考虑的事情是,如果你的代码对速度要求比较高,或者你在打印一些内容时,格式可能会在一些特殊情况下发生变化,比如说通信中断或者出现错误。

可以考虑这两个选项:

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)

或者

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

在第一个情况下,即使日志级别不是DEBUG,字符串格式化仍然会进行,这会影响整体性能。而在第二种情况下,如果VERBOSE是False,就什么都不会发生。

另外,我也遇到过因为调试信息的字符串格式化而产生异常的情况。比如在上面的代码中,如果“p”只有6个值,就会出现索引错误。或者如果其中一个p的值是“None”,你也会遇到异常。但是在第二种情况下,如果VERBOSE是False,你就不会看到因为调试代码而导致的崩溃。

所以,日志记录非常有用,但我通常只在需要将信息作为永久代码特性时使用它。如果我需要放一个临时信息来帮助调试一次性的问题,我通常会使用打印语句。

还有一个一般性的规则,最终用户应该看到的内容应该用“print”来输出。

1

Python的日志功能可以完全取代你用来调试的print语句。使用日志,你有更多的选择。默认情况下,日志会像print一样把信息输出到控制台,但你还可以用日志做其他事情,比如把信息写入一个日志服务器、重新格式化输出内容、添加一些额外的信息,比如这行代码来自哪个模块或者发生的时间。

3

有些人认为,记录日志是为了软件的操作员。也就是说,那些需要修复重复出现的错误,或者想知道软件在运行时状态的人。

而打印信息则是为了软件的用户。这些人关心的是运行软件的结果。如果出现错误,他们无法修复,只能选择忽略,或者干脆不再使用你的软件。

因此,传统上,日志记录会发送到stderr,而打印信息则发送到stdout

所以,记录日志不应该完全替代打印,因为它们是针对不同的受众。你可以错误地使用日志来完全替代打印(比如通过使用不同的处理程序,将信息发送到stderrstdout,并设置不同的级别),但这就像之前你错误地使用打印语句来记录日志一样。

顺便提一下,错误地使用print语句进行调试,有时被称为穴居人日志。欢迎走出洞穴!:)

8

print 仍然会用于输出那些对你程序运行至关重要的信息。而 logging 则是用来输出一些可能对了解你程序运行情况有帮助的信息(比如错误、进度等),但这些信息如果不显示也不会影响你程序的使用。

基础日志记录教程 讲解了何时应该使用 logging 而不是其他输出方式。

撰写回答