Python标准库--logging模块
本文作者:郭泽源,中南财经政法大学金融学院
本文编辑:胡艺粼
技术总编:孙一博
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~在日常做项目时,我们不可能直接将所有的信息都输出到控制台中,然而我们可以将这些信息记录到日志文件中,这样不仅方便我们查看程序运行时的情况,也可以在项目出现故障时根据程序运行时产生的日志快速定位问题出现的位置。在python中有很多可以记录日志的第三方库,而今天给大家介绍的是python内置的标准库模块——logging模块;logging模块简单而又强大,它可以记录python中包括第三方模块中的所有模块。
Python 标准库 logging 用作记录日志,默认分为六种日志级别(括号为级别对应的数值),NOTSET(0)、DEBUG(10)、INFO(20)、WARNING(30)、ERROR(40)、CRITICAL(50)。logging默认级别是WARNING, 我们自定义日志级别时注意不要和默认的日志级别数值相同,logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO、WARNING、ERROR、CRITICAL 级别的日志都会输出。详见下表:
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')
输出结果如下:
④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')
上面的基本使用可以让我们快速上手 logging 模块,但一般并不能满足实际使用,我们还需要自定义 Logger。获取 Logger 对象的方法为 getLogger(),我们可以创造多个 Logger 对象,但是真正输出日志的是root Logger 对象。每个 Logger 对象都可以设置一个名字,如果设置logger = logging.getLogger(__name__),__name__ 是 Python 中的一个特殊内置变量,他代表当前模块的名称(默认为__main__)。则 Logger 对象的 name 为建议使用使用以点号作为分隔符的命名空间等级制度。Logger 对象可以设置多个 Handler 对象和 Filter 对象,Handler 对象又可以设置 Formatter 对象。Formatter 对象用来设置具体的输出格式,常用变量格式如上面的表2所示。
示例代码如下:
import logging
import logging.handlers
logger = logging.getLogger("logger")
handler1 = logging.StreamHandler() #将日志信息发送到Stream
handler2 = 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')
通常来讲,在一个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():创建一个对应等级的日志记录
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 类解决实际开发中的问题,快去试一试吧!
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾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)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。