自动化测试之日志

1、概念

  日志就是用于记录系统运行时的信息,对一个事件的记录;也称为Log。
 

2、作用

  调试程序

  了解系统程序运行的情况,是否正常

  系统程序运行故障分析与问题定位

  用来做用户行为分析和数据统计

 

3、日志级别

  日志级别是指日志信息的优先级、重要性或者严重程度。

  常见的日志级别:

  DEBUG  →  调试级别,打印非常详细的日志信息,通常用于对代码的调试

  INFO  →  信息级别,打印一般的日志信息,突出强调程序的运行过程

  WARNING  →  警告级别,打印警告日志信息,表明会出现潜在错误的情形,一般不影响软件的正常使用

  ERROR  →  错误级别,打印错误异常信息,该级别的错误可能会导致系统的一些功能无法正常使用

  CRITICAL  →  严重错误级别,一个严重的错误,这表明系统可能无法继续运行、

  DEBUG < INFO < WARNING < ERROR< CRITICAL

  当为程序指定一个日志级别后,程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息。

 

4、日志的基本用法

  1. logging模块

  Python中有一个标准库模块logging可以直接记录日志。

import logging

logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")

  2. 设置日志级别

  logging中默认的日志级别为WARNING,程序中大于等于该级别的日志才能输出,小于该级别的日志不会被打印出来。

logging.basicConfig(level=logging.DEBUG)

  如何选择日志级别:

  1)开发环境和测试环境

  为了尽可能详细的查看程序的运行状态来保证上线后的稳定性,可以使用DEBUG或INFO级别的日志获取详细的日志信息。

  2)生产环境

  通常只记录程序的异常信息、错误信息等,可以设置成WARNING或ERROR级别。

  3. 设置日志格式

logging.basicConfig(format="%(levelname)s:%(name)s:%(message)s")

  format参数中可能用到的格式化信息:

  %(name)s  →  Logger的名字

  %(levelno)s  →  数字形式的日志级别

%(levelname)s  →  文本形式的日志级别

%(pathname)s  →  调用日志输出函数的模块的完整路径名,可能没有

%(filename)s  →  调用日志输出函数的模块的文件名

%(module)s  →  调用日志输出函数的模块名

%(funcName)s  →  调用日志输出函数的函数名

%(lineno)d  →  调用日志输出函数的语句所在的代码行

%(created)f  →  当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d  →  输出日志信息时的,自Logger创建以来的毫秒数

%(asctime)s  →  字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”

%(thread)d  →  线程ID。可能没有

%(threadName)s  →  线程名。可能没有

%(process)d  →  进程ID。可能没有

%(message)s  →  用户输出的消息

示例代码:

import logging

fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - % (message)s'
logging.basicConfig(level=logging.INFO, format=fmt)

logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
  4. 将日志信息输出到文件中
logging.basicConfig(filename="a.log")
 

5、日志的高级用法  

  1. logging日志模块四大组件

  日志器  →  Logger → 提供了程序使用日志的入口

  处理器 → Handler → 将logger创建的日志记录发送到合适的目的输出

  格式器 → Formatter → 决定日志记录的最终输出格式

  过滤器 → Filter → 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录

  2. Logger类

  Logger对象的任务:

向程序暴露记录日志的方法

基于日志级别或Filter对象来决定要对哪些日志进行后续处理

将日志消息传送给所有感兴趣的日志handlers

logger = logging.getLogger() 
logger = logging.getLogger("myLogger")

  logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则返回root日志器对象。 若以相同的name参数值多次调用getLogger()方法,将会返回指向同一个logger对象的引用。  

  Logger常用的方法:

方法 描述 
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical() 
打印日志
logger.setLevel() 设置日志器将会处理的日志消息的最低严重级别
logger.addHandler() 为该logger对象添加一个handler对象
logger.addFilter()  为该logger对象添加一个filter对象

  3. Handler类 

Handler对象的作用是将消息分发到handler指定的位置,比如:控制台、文件、网络、邮件等。

使用Handler实现类来创建对象,logging中内置的常用的Handler包括:

Handler 描述 
logging.StreamHandler  将日志消息发送到输出到Stream,如std.out,std.err或任何file-like对象。 
logging.FileHandler 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 
logging.handlers.RotatingFileHandler  将日志消息发送到磁盘文件,并支持日志文件按大小切割 
logging.hanlders.TimedRotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按时间切割 
logging.handlers.HTTPHandler 将日志消息以GET或POST的方式发送给一个HTTP服务器 
logging.handlers.SMTPHandler  将日志消息发送给一个指定的email地址 

   Handler常用的方法:  

方法 描述
handler.setLevel()  设置handler将会处理的日志消息的最低严重级别 
handler.setFormatter()  为handler设置一个格式器对象
handler.addFilter() 为handler添加一个过滤器对象

  4. Formatter类

formatter = logging.Formatter(fmt=None, datefmt=None, style='%')     
    # fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值 
    # datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S" 
    # style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'

日志的高级用法示例:

  将日志信息同时输出到控制台和文件中

import logging

# 定义日志格式
fmt =  '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - % (message)s'
formatter = logging.Formatter(fmt)

# 把日志输出到控制台中
logger = logging.getLogger()
sh = logging.StreamHandler()
sh.setFormatter(formatter)
logger.addHandler(sh)

# 把日志输出到文件中
fh = logging.FileHandler("./b.log")
fh.setFormatter(formatter)
logger.addHandler(fh)

 

6、每日生成一个日志文件

  将日志信息记录到文件中,以特定的时间间隔切换日志文件。

fh = logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCo unt=0)

  filename: 日志文件名

  when: 时间单位,可选参数

S - Seconds

M - Minutes

H - Hours

D - Days

midnight - roll over at midnight

W{0-6} - roll over on a certain day; 0 - Monday

  interval: 时间间隔

  backupCount: 日志文件备份数量。如果backupCount大于0,那么当生成新的日志文件时,将只保留backupCount个文件,删除最老的文件。 

示例代码:

import logging.handlers

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# 定义日志格式
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - % (message)s'
formatter = logging.Formatter(fmt)

# 输出到文件,每日一个文件
fh = logging.handlers.TimedRotatingFileHandler("./a.log", when='MIDNIGHT', interval=1, backupCount=3)
fh.setFormatter(formatter)
fh.setLevel(logging.INFO)
logger.addHandler(fh)

 

 
posted @ 2022-07-09 11:53  MToy  阅读(677)  评论(0)    收藏  举报