python 打印线程id_Python logging模块入门及分线程输出日志文件的实现

本文介绍了如何使用Python的logging模块实现根据线程单独记录日志,每个线程的日志将输出到独立的文件中。通过创建特定的记录器并绑定到线程ID,避免了日志混杂,实现了日志文件的清晰管理。文中还讨论了logging模块的基本使用,包括记录器、处理器和过滤器的概念及其工作原理。
摘要由CSDN通过智能技术生成

引入

最近工作上需要给自动测试框架添加一个新功能:根据线程来单独记录日志。原有的框架中存在一个日志模块,其他模块都通过它来记录日志,日志分别会输出到控制台和一个文件之中。假如主线程发起了一个或多个子线程,在该项新功能打开的情况下,子线程记录的日志会输出到一个独立的文件,且文件名与其他线程均不相同。实现的过程不算复杂,简单讲一讲我的思路。

第一次写技术文章, 定有不足之处,恳求斧正。我也希望知道这个做法是否符合最优实践。

【感谢指出:

这里的dictionary线程安全有问题吧,尽管在Cpython下有GIL擦屁股但同时读写最好还是加个锁?】

首先来看看Python的logging模块。一般认为,使用logging模块代替print是更好的实践,程序员可以通过调节模块的各项属性来控制整个程序的日志输出。要使用该模块,须先行配置根记录器(root

logger)。最简单的方式:

import logging

logging.basicConfig(level=logging.DEBUG)

basicConfig()会做以下两件事:添加默认的处理器

添加默认的格式化器(formatter)

根记录器的默认级别为“WARNING”。重要级别大于等于该等级的日志才会被进一步处理。详细的级别如下:

LevelNumeric value

CRITICAL 50

ERROR 40

WARNING 30

INFO 20

DEBUG 10

NOTSET 0

通过 logging.getLogger(name),我们可以获得一个记录器的实例。每一个记录器与其名称都是一对一的关系,传入同样的名字会得到同一个记录器。如果不指定名称(即name=’’),getLogger()将返回根记录器。与根记录器不同,其他记录器的默认级别为“NOTSET”,若不做其他配置,日志会被直接向上传递。在实践中,通常的做法是在模块级别获取记录器:

logging.getLogger(__name__)

日志的向上传递

Python的logging模块会对所有记录器进行分层,记录器之间可以存在父子关系。分层的标志便是记录器名称中的“.”符号。比如,某记录器的名称为“foo”,“foo.bar”对应的就是其子记录器。所有的一级记录器均是根记录器的子记录器。

子记录器的日志在本层级处理后,会根据其propagate属性的真与假继续向上传递日志或停止上传。默认情况下,日志是会层层上递的,所有日志最终都会被送到根记录器。一般情况下只需要为各模块获取默认的记录器,将记录直接上传,在日志中显示产生日志的模块名称,就能比较好地分辨出日志的来源。

处理器

在进行配置前,包括根记录器在内的所有记录器,都没有任何处理器。然而,在未配置根记录器的情况下调用logging模块自身的记录方法(logging.debug()、logging.warning()等等),basicConfig()也会被调用,对根记录器加上一个缺省的StreamHandler。每一个处理器均会将日志输出至某一目标(流或文件)。根据处理器(handler)的不同,同一条日志可以用不同的格式分别输出。因此,在设置多个处理器时,必须考虑清楚是否会有重复记录的可能。这也是我自己在应用过程中被坑了好几次的地方,曾经用了不少时间调试同一条日志反复出现的“bug”。

Logging模块自带常用的处理器,可以满足绝大多数情况下的需求。接下来我们会用到的有StreamHandler和RotatingFileHandler。前者将日志输出到流(stdout或stderr)。后者将日志输出到文件,还能够设置单个文件大小的上限,接近上限时,处理器会开启一个新文件继续记录。常见的日志文件形式“xxx.1.log”“xxx.2.log”等等就是滚动记录文件的例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值