查看原文
其他

Python标准库--logging模块

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:郭泽源,中南财经政法大学金融学院

本文编辑:胡艺粼

技术总编:孙一博

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
引言

在日常做项目时,我们不可能直接将所有的信息都输出到控制台中,然而我们可以将这些信息记录到日志文件中,这样不仅方便我们查看程序运行时的情况,也可以在项目出现故障时根据程序运行时产生的日志快速定位问题出现的位置。在python中有很多可以记录日志的第三方库,而今天给大家介绍的是python内置的标准库模块——logging模块;logging模块简单而又强大,它可以记录python中包括第三方模块中的所有模块。

使用方法
01日志级别

Python 标准库 logging 用作记录日志,默认分为六种日志级别(括号为级别对应的数值),NOTSET(0)、DEBUG(10)、INFO(20)、WARNING(30)、ERROR(40)、CRITICAL(50)。logging默认级别是WARNING, 我们自定义日志级别时注意不要和默认的日志级别数值相同,logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO、WARNING、ERROR、CRITICAL 级别的日志都会输出。详见下表:

02基本使用

logging 使用非常简单,使用 basicConfig() 方法就能满足基本的使用需要,如果方法没有传入参数,会根据默认的配置创建Logger 对象,默认的日志级别被设置为 WARNING

代码如下:

import logginglogging.basicConfig()logging.debug('This is a debug message')logging.info('This is an info message')logging.warning('This is a warning message')logging.error('This is an error message')logging.critical('This is a critical message')

输出结果如下:

如结果所示,默认的日志输出格式为:
WARNING:日志级别
root:Logger日志名称
warn message:日志消息内容
另外logging模块还可以传入参数,用来改变一些基本配置,该函数可选的参数如下:
①filename:指定日志输出目标文件的文件名,如果使用该参数,日志就不会被输出到控制台,而是记录到日志文件中。
②filemode:指定日志文件的打开模式,默认为’a’。这一参数只有在filename指定时才有效。
③level:指定输出的最低日志级别,文字和对应数值均可。

④format:指定日志的格式字符串。例如,如果需要输出日志级别字段,则可以设置%(levelname)s,输出文字形式的日志级别。下表为logging模块支持的常用格式字符串字段:

传入常用的参数,示例代码如下:
import logging
logging.basicConfig(filename="test.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%M-%Y %H:%M:%S", level=logging.DEBUG) logging.debug('This is a debug message')logging.info('This is an info message')logging.warning('This is a warning message')logging.error('This is an error message')logging.critical('This is a critical message')
生成的日志如下:

可以发现,日志的输出级别已经改为DEBUG。
03自定义logger

上面的基本使用可以让我们快速上手 logging 模块,但一般并不能满足实际使用,我们还需要自定义 Logger。获取 Logger 对象的方法为 getLogger(),我们可以创造多个 Logger 对象,但是真正输出日志的是root Logger 对象。每个 Logger 对象都可以设置一个名字,如果设置logger = logging.getLogger(__name__),__name__ 是 Python 中的一个特殊内置变量,他代表当前模块的名称(默认为__main__)。则 Logger 对象的 name 为建议使用使用以点号作为分隔符的命名空间等级制度。Logger 对象可以设置多个 Handler 对象和 Filter 对象,Handler 对象又可以设置 Formatter 对象。Formatter 对象用来设置具体的输出格式,常用变量格式如上面的表2所示。

  Logger 对象和 Handler 对象都可以设置级别,而默认 Logger 对象级别为 30 ,也即 WARNING,默认 Handler 对象级别为 0,也即 NOTSET。logging 模块这样设计是为了更好的灵活性,比如有时候我们既想在文件中输出DEBUG 级别的日志,又想在控制台输出WARNING级别的日志。可以只设置一个最低级别的 Logger 对象,两个不同级别的 Handler 对象。

示例代码如下:

import loggingimport logging.handlers
logger = logging.getLogger("logger")
handler1 = logging.StreamHandler() #将日志信息发送到Streamhandler2 = logging.FileHandler(filename="test.log") #将日志消息发送到磁盘文件
#设置日志信息最低级别logger.setLevel(logging.DEBUG)handler1.setLevel(logging.WARNING)handler2.setLevel(logging.DEBUG)
#设置一个格式器对象formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")handler1.setFormatter(formatter)handler2.setFormatter(formatter)
#为handler添加一个过滤器对象logger.addHandler(handler1)logger.addHandler(handler2)
# 分别为 10、30、30# print(handler1.level)# print(handler2.level)# print(logger.level)
logger.debug('This is a customer debug message')logger.info('This is an customer info message')logger.warning('This is a customer warning message')logger.error('This is an customer error message')logger.critical('This is a customer critical message')
控制台输出结果为:

文件中输出内容为:

从上述例子可以看出,日志信息同时输出到了log文件和控制台,并且实现了不同设置级别的输出。
04logging四大组件
由上述例子可以看出,logging模块是由四大组件构成,如下表所示:

通常来讲,在一个logger对象中,我们可以创建多个handler,对每一个handler设置不同的输出配置,如日志级别、输出位置等。同时,我们还可以对每个handler设置不同的过滤条件和输出格式,这样,就可以实现多样化的日志输出需求,这也是四大组件的基本工作流程。

四大组件的常见用法如下:
  • logger类

logger用于提供日志接口,常用于配置和发送日志消息。我们一般使用logging.getLogger(name)方法来获得一个logger对象。其中,可选参数name指定日志器名称,默认为“root”。常用方法包括:

①logger.setLevel():设置日志器处理日志信息的最低级别

②logger.addHandler():为该logger对象添加一个handler对象

③logger.removeHandler():为该logger对象添加移除一个handler对象

④logger.addFilter():为该logger对象添加一个filter对象

⑤logger.removeFilter():为该logger对象移除一个filter对象

⑥logger.debug(),logger.info(),logger.warning(),logger.error(),logger.critical():创建一个对应等级的日志记录

⑦logger.log():获取一个日志level参数来创建一个日志记录
  • handler类

handler对象用于将指定的日志信息发送到指定的位置。一个logger对象可以添加多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。通过handler,我们可以将日志同时输出到多个位置。常用的方法包括:

①handler.setLevel():设置handler处理的日志信息最低级别

②handler.setFormatter():为handler设置一个格式器对象

③handler.addFilter():为handler添加一个过滤器对象

④handler.removeFilter():为handler删除一个过滤器对象

⑤logging.StreamHandler():将日志信息发送到Stream

⑥logging.FileHandler():将日志消息发送到磁盘文件

  • filter类

filter是一个过滤器,可以实现比logger和handle更细致灵活的过滤功能。

  • formatter类

formatter对象用来输出格式化字符串,构造方法如下:

logging.Formatter.__init__(fmt=None, datefmt=None)

其中:

fmt:指定信息的格式化字符串,如不设定则使用信息的原始字符串

datefmt:指定日期的格式化字符串,如不设定则使用默认格式"%Y-%m-%d %H:%M:%S"

了解了四大组件的基本定义之后,我们通过图示的方式来理解下信息的传递过程:

至此,python中的logging就全部介绍完毕了,Python logging 库设计的真的非常灵活,如果有特殊的需要还可以在这个基础的 logging 库上进行改进,创建新的 Handler 类解决实际开发中的问题,快去试一试吧!

END

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!




往期推文推荐 盲区探索——Stata的读写极限
Camelot提取PDF表格:一页多表、多页一表

Stata绘图系列——条形图绘制

Python常见内置函数(一)Stata绘图系列——饼形图绘制【爬虫实战】深交所服务业年报数据

“挂羊头卖狗肉”?

Python与excel交互--xlsxwriter模块

cnmapsearch——离公司最近的快餐店在哪

Python中的异常处理 Python交互式数据可视化——酷炫的Altair库 hk系列命令(3)—— hktrade hk系列命令(2)—— hkar hk系列命令(1)—— hkstock 超好用的字符串方法 基于Python的假设检验实现Stata与MySQL交互--基础操作 Jupyter Notebook中的魔术命令
     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

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

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