Python 程序员必须掌握的日志记录
写在之前
在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题,我们可以通过「日志记录」来搞清楚到底发生了什么事情。
除了在生活中,在日常的系统开发以及调试等过程中,记录日志同样是一件很重要的事情。很多编程初学者并没有「记录日志」的习惯,认为记录日志是一件可有可无的事情,出现问题的时候只要使用print函数打印一下程序的中间结果即可,真是tooyoungtoonaive。只是print的话对于简单的脚本程序来说或许可行,可是到了碰到复杂的系统,你如果还是只用print这种方式的话,你会看到大量的消息,看到吐也不一定能找到其中有用的消息。
「日志」是一个系统的重要组成部分,用来记录用户操作、系统运行状态和错误信息,它的好坏直接影响到系统出现问题时定位的速度,有日志记录,我们可以在服务崩溃的时候很快的通过查看日志来发现问题出现的地方,同样也可以通过对日志的观察和分析,提前发现系统可能存在的风险。
Python的标准日志模块
上面我们说了「日志」是如此的重要,作为无所不能的Python当然也有日志相关的功能,Python标准库中提供了logging模块供我们使用。在最简单的使用中,默认情况下logging将日志打印到屏幕终端,我们可以直接导入logging模块,然后调用debug,info,warn,error和critical等函数来记录日志,默认日志的级别为warning,级别比warning高的日志才会被显示(critical>error>warning>info>debug),「级别」是一个逻辑上的概念,用来区分日志的重要程度。
importlogging logging.debug('debugmessage') logging.info("infomessage") logging.warn('warnmessage') logging.error("errormessage") logging.critical('criticalmessage')
上述代码的执行结果如下所示:
WARNING:root:warnmessage
ERROR:root:errormessage
CRITICAL:root:criticalmessage
我在上面说过,用print的话会产生大量的信息,从而很难从中找到真正有用的信息。而logging中将日志分成不同的级别以后,我们在大多数时间只保存级别比较高的日志信息,从而提高了日志的性能和分析速度,这样我们就可以很快速的从一个很大的日志文件里找到错误的信息。
配置日志格式
我们在用logging来记录日志之前,先来进行一些简单的配置:
importlogging logging.basicConfig(filename='test.log',level=logging.INFO) logging.debug('debugmessage') logging.info("infomessage") logging.warn('warnmessage') logging.error("errormessage") logging.critical('criticalmessage')
上面的例子中,我是用basicConfig对日志进行了简单的配置,其实我们还可以进行更为复杂些的配置,在此之前,我们先来了解一下logging中的几个概念:
- Logger:日志记录器,是应用程序中可以直接使用的接口。
- Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久。
- Formatter:格式化,用以配置日志的输出格式。
上述三者的关系是:一个Logger使用一个Handler,一个Handler使用一个Formatter。那么概念我们知道了,该如何去使用它们呢?我们的logging中有很多种方式来配置文件,简单的就用上面所说的basicConfig,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用fileConfig读取配置文件。
基本的知识我们知道了,下面我们来做一个小的题目:日志文件保存所有debug及其以上级别的日志,每条日志中要有打印日志的时间,日志的级别和日志的内容。请先自己尝试着思考一下,如果你已经思考完毕请继续向下看:
importlogging logging.basicConfig( level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(message)s', filename="test.log" ) logging.debug('debugmessage') logging.info("infomessage") logging.warn('warnmessage') logging.error("errormessage") logging.critical('criticalmessage')
上述代码的一次运行结果如下:
2018-10-1922:50:35,225:DEBUG:debugmessage
2018-10-1922:50:35,225:INFO:infomessage
2018-10-1922:50:35,225:WARNING:warnmessage
2018-10-1922:50:35,225:ERROR:errormessage
2018-10-1922:50:35,225:CRITICAL:criticalmessage
我刚刚在上面说过,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用fileConfig读取配置文件。下面我们就来看一个典型的日志配置文件(配置文件名为logging.conf):
[loggers] keys=root [handlers] keys=logfile [formatters] keys=generic [logger_root] handlers=logfile [handler_logfile] class=handlers.TimedRotatingFileHandler args=('test.log','midnight',1,10) level=DEBUG formatter=generic [formatter_generic] format=%(asctime)s%(levelname)-5.5s[%(name)s:%(lineno)s]%(message)s
在上述的日志配置文件中,首先我们在[loggers]中声明了一个叫做root的日志记录器(logger),在[handlers]中声明了一个叫logfile的日志处理器(handler),在[formatters]中声明了一个名为generic的格式化(formatter)。之后在[logger_root]中定义root这个日志处理器(logger)所使用的日志处理器(handler)是哪个,在[handler_logfile]中定义了日志处理器(handler)输出日志的方式、日志文件的切换时间等。最后在[formatter_generic]中定义了日志的格式,包括日志的产生时间,级别、文件名以及行号等信息。
有了上述的配置文件以后,我们就可以在主代码中使用logging.conf模块的fileConfig函数加载日志配置:
importlogging importlogging.config logging.config.fileConfig('logging.conf') logging.debug('debugmessage') logging.info("infomessage") logging.warn('warnmessage') logging.error("errormessage") logging.critical('criticalmessage')
上述代码的运行一次的结果如下所示:
2018-10-1923:00:02,809WARNI[root:8]warnmessage
2018-10-1923:00:02,809ERROR[root:9]errormessage
2018-10-1923:00:02,809CRITI[root:10]criticalmessage
写在之后
正如标题中所说的那样,我认为「日志记录」是每个Python程序员必须要知道且学会的东西,也是每个程序员必须具备的意识。如果你之前没有使用过日志亦或者说不知道该怎么去使用日志记录,这篇文章我相信会给你带来一些帮助。
Python的日志库设计之好,用起来之灵活,可以说是Python标准库中相当优秀的存在。当然上面我们所说的只是Python日志库中很少的一部分,更多的操作和内容还需要你在今后的学习和实践中自己去发掘和运用。
Theend。
以上就是Python程序员必须掌握的日志记录的详细内容,更多关于python日志的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。