(十四)日志

日志收集

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')

 

posted @ 2019-11-01 17:34  xxy会飞的鱼  阅读(195)  评论(0编辑  收藏  举报