【测试开发】python系列教程:logging日志模块

这次我们分享python的logging库


在我们正常的开发中,总能想要打印一些信息,或者打印日志,我们都是用的print,但是在小规模的程序开发中是可以来用的,也便于调试,但是对于大点的项目,我们想要保存执行过程中的日志,用print来打印来说就不能满足了。我们用loggin模块可以来记录,以排查程序在某一个时候崩溃的具体原因,以便及时定位Bug进行抢救。

那么我们来看日志有什么作用呢?

进行程序(代码)的调试
程序运行过程中的问题定位和分析
收集程序运行的情况

那么我们看下logging如何来使用的。

首先来看下logging支持日志的几个级别

logging支持的日志五个级别
debug() 调试级别,一般用于记录程序运行的详细信息
info() 事件级别,一般用于记录程序的运行过程
warnning() 警告级别,,一般用于记录程序出现潜在错误的情形
error() 错误级别,一般用于记录程序出现错误,但不影响整体运行
critical() 严重错误级别 , 出现该错误已经影响到整体运行

使用Python的小伙伴对WARNING和ERROR特别的熟悉,在一些模块版本过低的时候运行程序就会出现WARNING的警告。

我们来用代码演示下

import logging

logging.debug("debug  loging" )
logging.info("info  loging" )
logging.warning("warning  loging" )
logging.error("error loging")
logging.critical("critical  loging")

运行下,看下结果

其实有没有发现,我们的debug和info的信息没有打印出来,其实很简单。默认情况下,logging将日志打印到屏幕,日志级别为WARNING。而debug和info在warnning级别之下,所以不打印。那么我们如何打印呢,另外增加时间的打印

结果输出

我们可以根据需求,去设置。我们看下logging.basicConfig函数

主要可以对日志的输出格式及方式做相关配置支持的参数由:

filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
SDAD
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING,可选 logging.DEBUG logging.INFO logging.WARNING logging.ERROR logging.CRITICAL
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,
  默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

那么记录到文件可以这么写

import logging

logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  \
                    datefmt='%a, %d %b %Y %H:%M:%S',filemode='a',filename='test.log')
logging.debug("debug  loging" )
logging.info("info  loging" )
logging.warning("warning  loging" )
logging.error("error loging")
logging.critical("critical  loging")

结果打印

其实这里没有打印,而是写入到了文件中

现在又有了新需求,我不能只把日志记录到文件,有些日志信息我还是想直接在屏幕输出,而且还不影响日志记录文件,此过程比较复杂,

logging的四大组件

Loggers 提供应用程序可直接使用的接口

Handlers 发送日志到适当的目的地

Filters 提供了过滤日志信息的方法

Formatters 指定日志显示格式

我们去实现下

import logging

logger = logging.getLogger()   #创建一个logger,默认为root logger
logger.setLevel(logging.DEBUG)   #设置全局log级别为debug。注意全局的优先级最高

hterm =  logging.StreamHandler()    #创建一个终端输出的handler,设置级别为error
hterm.setLevel(logging.ERROR)

hfile = logging.FileHandler("test1.log")    #创建一个文件记录日志的handler,设置级别为info
hfile.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')   #创建一个全局的日志格式

hterm.setFormatter(formatter)   #将日志格式应用到终端handler
hfile.setFormatter(formatter)   #将日志格式应用到文件handler


logger.addHandler(hterm)    #将终端handler添加到logger
logger.addHandler(hfile)    #将文件handler添加到logger
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',  \
                    datefmt='%a, %d %b %Y %H:%M:%S',filemode='a',filename='test.log')
logging.debug("debug  loging" )
logging.info("info  loging" )
logging.warning("warning  loging" )
logging.error("error loging")
logging.critical("critical  loging")

结果展示

文件中打印

这样我们就实现了在文件中输出对应的格式的内容,在控制台输出我们设置登记的内容。

里面有一个用到handler,那么他是用来干啥呢

handler 负责发送相关的信息到指定目的地

常用的Handler方法:

Handler.setLevel(lel):指定日志级别,低于lel级别的日志将被忽略
Handler.setFormatter():给这个handler选择一个Formatter
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
可用的handler类型有:

logging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息
logging.FileHandler 用于向一个文件输出日志信息
logging.handlers.RotatingFileHandler 类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出
logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件
logging.handlers.SocketHandler 使用TCP协议,将日志信息发送到网络。
logging.handlers.DatagramHandler 使用UDP协议,将日志信息发送到网络。
logging.handlers.SysLogHandler 日志输出到syslog
logging.handlers.NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.SMTPHandler 远程输出日志到邮件地址
logging.handlers.MemoryHandler 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler 通过GET或POST远程输出到HTTP服务器

如果需要处理规则

filter定义handler处理的规则
如定义一个规则
filter=logging.Filter('testlog.leizi')    #符合testlog.leizi的才能记录日志到文件
hterm.addFilter(filter)            #将filer应用到hterm的handle

我们可以根据需求选择搭配对应的处理方式即可。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

全部资料获取

猜你喜欢

转载自blog.csdn.net/wx17343624830/article/details/131417452
今日推荐