(十四)日志
日志收集
1.日志作用
不管是在项目开发还是测试过程中,项目运行一旦出现了问题,日志信息就非常重要了,日志是定位问题的重要手段,是发现bug的线索
2.日志级别
脚本运行会有很多情况,比如调试信息,报错异常信息等,日志要根据这些不同情况继续分级管理,不然对于排查问题的筛选会有比较大的干扰,日志一般定位的级别如下:
级别 | 何时使用 |
DEBUG | 调试信息,也是最详细的日志信息 |
INFO | 证明事情按预期工作 |
WARNING | 表明发生了一些意外,或者不久的将来会发生问题(如:磁盘满了),软件还是在正常工作 |
ERROR | 由于更严重的问题,软件已不能执行一些功能了 |
CRITICAL | 严重错误,表明软件已不能继续运行了 |
首先我们日志要按照info,debug,error等级别来进行区分的,当然这个级别可以自己去设置,在一般情况下我们普通的输出我们直接用info类型,调试的时候就用debug类型,如果预计有错误时,那么我们就用erro类型的日志,一般情况1下使用info级别最合适。
log的优先级如下:
3.日志格式
日志的格式是为了提高日志的可读性,比如:时间+模块+行数+日志具体信息的内容格式,如果日志信息杂乱无章的全部输出来,这样也不利于定位问题。
4.日志位置
一个项目中会有很多日志采集点,而日志采集点必须结合业务属性来设置,比如在登录代码执行前可以插入“准备登录”,日志信息如果登录完成1之后,再设置登录的提示日志就会给人造成误解,无法判断到底是登录之前的问题还是登录之后的问题,因此日志采集点的位置很重要.
5.logging模块
python的logging模块提供了通用日志系统,这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,SOKET等,甚至可以以自己的方式实现日志
6.logging的构成
logging模块包括logger,Handler,Filter,Formatter
logger记录器:用于设置日志采集
Handler处理器:将日志信息发送至合适的路径
Filter过滤器:提供了更好的粒度控制,它可以决定输出哪些日志记录
Formatter格式化器:指明了最终输出的日志格式
6.1 logger记录器
Logger是一个树形层级结构,在使用接口debug,info,warm,error,critical;在使用之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root Logger,并应用默认的日志级别(WARN),Handler和Fomstter.
方法:
basicConfig(**kwargs)为日志记录系统做基本配置
部分参数:
filename:指定日志文件名称
filemode:指定打开文件的模式,如果指定了filename
format:为处理程序使用指定的格式字符串
datefmt:使用指定的日期/时间格式,样式如果指定了格式字符串,则使用它来指定格式字符串的类型
level:将根记录器级别设置为指定级别
代码实现:
控制台结果:
ps:Python文件名称最好不要和关键字一样
6.2.Handler处理器
Handler处理器,将日志记录发送至合适的路径,Handler处理器类型有很多种,常用的有3个:
1)StreamHandler
将日志记录输出发送到诸如sys.stdout,sys.stderr或类似文件流的对象,上面例子就是输出到控制台
2)FileHandler
将日志记录输出发送到磁盘文件,它继承了StreamHandler的输出功能
logging.basicConfig(filename="runlog.log",level=logging.DEBUG)
3)NullHandler
不做任何格式化或输出,它本质上是一个开发人员使用的”无操作“处理程序。
6.3.Filter过滤器
Handlers和loggers可以使用Filters来完成比级别更复杂的过滤
6.4 Formatter
使用Formatter对象设置日志信息最后的规则,结构和内容,默认的时间格式为:%Y-%m-%d%H%m%S
常用格式如下:
格式 | 描述 |
---|---|
%(levelno)s | 打印日志级别的数值 |
%(levelname)s | 打印日志级别名称 |
%(pathname)s | 打印当前执行程序的路径 |
%(filename)s | 打印当前执行程序名称 |
%(funcName)s | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(asctime)s | 打印日志的时间 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |
使用方法如下:
logging.basicConfig(filename='runlog.log',level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')