查看原文
其他

Python标准库-logging模块(1)

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:李金洋

本文编辑:胡   婧

技术总编:张学人

爬虫俱乐部2018年11月30日至2018年12月2日将在武汉举行的Stata编程技术培训招生圆满结束,感谢大家的厚爱!

我们将会在寒假期间举办下一期的Stata编程技术培训,感兴趣的朋友可继续关注我们的寒假班招生!

Logging,即日志记录,通俗地讲,就是将某些软件运行时所发生的事件记录在一个文件中。在编写程序时,撰写日志虽然是一个繁琐且耗时的事情,但是可以帮助程序猿记录当前脚本的运行状态,一旦程序运行时发生异常,可以通过调用日志记录来进行问题排查,从而大大减轻了程序调试及后期维护的压力。在python中,有很多提供日志记录功能的第三方库可供选择,而今天我们为大家介绍的是python内置的一个标准库模块——logging模块,该模块功能强大且操作简单,其日志记录的功能适用于包括第三方模块在内的所有的python模块。在使用该模块之前,我们仍然通过import logging命令导入该模块。

一般来讲,一条日志信息对应的是一个事件的发生,而一个事件通常需要包括事件发生时间、位置、严重程度(日志级别)及事件内容等字段信息。我们可以通过自定义日志格式来确定日志文件中所包含的字段。其中,不同的应用程序所定义的日志级别可能有所不同,而logging模块默认定义了5个日志输出级别,其等级自低到高依次为:DEBUG < INFO < WARNING < ERROR < CRITICAL,详见表1。

表1  logging模块定义的日志级别

logging模块提供了两种记录日志的方式,第一种就是使用该模块提供的函数,其基本思想是:只有级别大于或等于日志记录器指定级别的日志记录才会被输出,小于该级别的日志记录将会被丢弃。常用函数如下:

1. 创建指定级别的日志记录:

logging.log(logging.level, msg)

或者:

logging.level(msg)

其中,level为指定的日志级别,msg为格式化字符串。

举个简单的例子~

import logging
#第一种方法:logging.level( )
logging.debug("normal & in detail") logging.info("normal & key words") logging.warning("something unexpected") logging.error("something wrong") logging.critical("critical error")
#第二种方法:logging.log( )
logging.log(logging.DEBUG, "normal & in detail") logging.log(logging.INFO, "normal & key words") logging.log(logging.WARNING, "something unexpected") logging.log(logging.ERROR, "something wrong") logging.log(logging.CRITICAL, "critical error")

两种方法的输出结果相同。这里需要注意的是:

① 上面输出结果中每行日志记录的各个字段含义分别是:

日志级别:日志器名称:日志内容

② 默认情况下,logging输出日志的最低级别为warning,因此在上面的例子中,只有warning及以上级别的信息被输出在控制台中,而更低级别的debug和info的信息并没有输出。我们可以通过logging.basicConfig()函数来改变输出的日志级别。

2. 为logging日志系统做一些基本配置:

logging.basicConfig(**kwargs)

其中,kwargs为该函数可接受的关键字参数,常用的参数包括:

filename:指定日志输出目标文件的文件名,如果使用改参数,日志就不会被输出到控制台,而是记录到日志文件中。

filemode:指定日志文件的打开模式,默认为’a’。这一参数只有在filename指定时才有效。

level:指定输出的最低日志级别,文字和对应数值均可。

format:指定日志的格式字符串。例如,如果需要输出日志级别字段,则可以设置%(levelname)s,输出文字形式的日志级别。为了方便读者查阅,logging模块支持的常用格式字符串字段以表格形式附在本文文末。

datefmt:指定时间格式。

例如:

logging.basicConfig(level=logging.ERROR)
#设置输出级别为ERROR
logging.log(logging.DEBUG, "normal & in detail") logging.log(logging.INFO, "normal & key words") logging.log(logging.WARNING, "something unexpected") logging.log(logging.ERROR, "something wrong") logging.log(logging.CRITICAL, "critical error")

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙30000+粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:https://ke.qq.com/course/286526?tuin=1b60b462,敬请关注!


这里需要注意的是,logging.basicConfig()函数是一个一次性的简单配置工具,即只有在第一次调用该函数时会起作用。如果我们对输出级别做了多次改变,那么我们必须重新导入该模块后再进行设置才能生效。重新加载模块的方式有两种:一种是将程序关闭后重新启动,这种方法较为简单粗暴,但是会丢失之前存入的数据;另一种是使用reload()方法,该方法在Python的不同版本中有不同的使用方式,Python3.4及以上版本的reload()方法需要在importlib模块中使用,例如:

import importlib importlib.reload(logging) #重新加载logging模块
logging.basicConfig(level = 20) #再次设置输出级别,20代表输出的最低级别为INFO
logging.log(logging.DEBUG, "normal & in detail") logging.log(logging.INFO, "normal & key words") logging.log(logging.WARNING, "something unexpected") logging.log(logging.ERROR, "something wrong") logging.log(logging.CRITICAL, "critical error")

我们发现,输出级别已经成功地改为INFO。

掌握了上述知识后,我们使用logging模块提供的函数来将输出指定级别的事件,见下例:

import importlib importlib.reload(logging) testfmt="%(asctime)s - %(levelname)s - %(message)s"
testdfmt="%m/%d/%Y %H:%M:%S %p"
logging.basicConfig(level=logging.DEBUG,filemode='w',format=testfmt,datefmt=testdfmt) hungrylevel=['1','2','3','4','5'] hungry=input('你的饥饿等级为:')
if hungry==hungrylevel[0]:    logging.log(logging.DEBUG, "麻辣烫与关东煮")
elif hungry==hungrylevel[1]:    logging.log(logging.INFO, "水煮鱼与烧汁虾")
elif hungry==hungrylevel[2]:    logging.log(logging.WARNING, "冒菜与串串香")
elif hungry==hungrylevel[3]:    logging.log(logging.ERROR, "冷锅串串与钵钵鸡")
elif hungry==hungrylevel[4]:    logging.log(logging.CRITICAL, "火锅火锅")
else:    print('饿着吧你')

上述程序运行结果如下:

今天的介绍就到这里啦,在下一篇推文中,我们会为大家介绍logging模块提供的另一种记录日志的方式——使用logging模块的四大组件

附表  logging模块定义的格式化字符串字段

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐


关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。



此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存