logging或print的选择问题

2020年2月14日 / 19次阅读 / Last Modified 2020年5月24日
logging模块print

我困惑了一段时间,既然logging模块在功能上可以完全代替print函数,那么对于认真写的软件项目,是不是都要使用logging模块来代替print函数呢?

不是的。logging模块和print函数各自有自己的应用场景,要根据你的需求来选择使用谁。

一般而言,对于大型的软件项目,总是会选择logging模块,不言而喻,大型软件项目有大量的log输出需要,print函数这个时候就显得有限单薄了。logging模块对log进行了5级分类,并且可以很容易的控制log的输出最小级别,log的输出格式,log的输出对象(stdout,file,socket或email),这些都是print函数没有的复杂功能。在服务器端(后端)24*7运行的软件系统,由于不会有人实时查看其stdout的输出,log输出对象一般是file,此时就需要对log file进行定时的分析,logging模块提供的功能,把很多重复劳动统一起来提供。

相对来说,小型的工具类软件,一般运行后很快就结束的那种,其实print函数向stdout输出就足够了。我认为不需要纠结使用print函数就是很low的说法,用什么要根据需求。

如果你只会print函数,而不会logging模块,这是能力问题。在做少大型的软件项目的时候,你会感觉到print函数确实有些降低工作效率,需要切换到logging模块。

补充网上看到的一段文字,来自PyCon 2018的一个介绍logging模块的演讲,可能是翻译稿,但是翻的很不错:

在开发过程中,如果程序运行出现了问题,我们是可以使用我们自己的 Debug 工具来检测到到底是哪一步出现了问题,如果出现了问题的话,是很容易排查的。但程序开发完成之后,我们会将它部署到生产环境中去,这时候代码相当于是在一个黑盒环境下运行的,我们只能看到其运行的效果,是不能直接看到代码运行过程中每一步的状态的。在这个环境下,运行过程中难免会在某个地方出现问题,甚至这个问题可能是我们开发过程中未曾遇到的问题,碰到这种情况应该怎么办?

如果我们现在只能得知当前问题的现象,而没有其他任何信息的话,如果我们想要解决掉这个问题的话,那么只能根据问题的现象来试图复现一下,然后再一步步去调试,这恐怕是很难的,很大的概率上我们是无法精准地复现这个问题的,而且 Debug 的过程也会耗费巨多的时间,这样一旦生产环境上出现了问题,修复就会变得非常棘手。但这如果我们当时有做日志记录的话,不论是正常运行还是出现报错,都有相关的时间记录,状态记录,错误记录等,那么这样我们就可以方便地追踪到在当时的运行过程中出现了怎样的状况,从而可以快速排查问题。

因此,日志记录是非常有必要的,任何一款软件如果没有标准的日志记录,都不能算作一个合格的软件。作为开发者,我们需要重视并做好日志记录过程。

-- EOF --

本文链接:https://www.pynote.net/archives/1804

留言区

《logging或print的选择问题》有5条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    日志记录是非常有必要的,任何一款软件如果没有标准的日志记录,都不能算作一个合格的软件。 [回复]

  • 麦新杰

    解决bug,不要完全依赖于复现(有些bug难以复现),要与分析logging相结合,这才是王道!logging是必须的。 [回复]

  • 麦新杰

    使用logging做debug,对代码的修改可以永久保留,而用print,每次都要不停地来回地修改。小项目还好说,大项目这样改来改去也不是个事儿。 [回复]

  • 麦新杰

    看到一个人总结debug:可以使用print函数,或者assert函数,大型项目就需要logging了,可以定义输出级别,在debug的时候,也许可以不修改代码。 [回复]

  • 麦新杰

    print函数想sys.stdout输出,因此命令行的重定向有效;而logging模块则不是,指向屏幕的输出,命令行的重定向无效,logging依然会向屏幕输出。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top