日志的概念

日志是记录系统运行过程中各种重要信息的文件,在系统运行过程中由各进程创建并记录

日志的作用

  • 记录系统的运行过程及异常信息
  • 调试
  • 定位错误
  • 数据分析

运行日志

运行日志的记录包括:
(1)启动成功或失败
(2)定位成功或失败
(3)操作成功或失败
(4)检查成功或失败
(5)资源加载失败
(6)警告信息
(7)超时
(8)数据读取成功或失败
(9)正常操作过程的步骤顺序

日志级别

  • critical 严重的错误,这表明程序本身可能无法继续运行
  • error 严重的问题,软件没能执行一些功能
  • warning 一个迹象表明,一些意想不到的事情发生,或表明一些问题在不久的将来,这个软件还能按预期工作
  • info 确认一切按预期运行
  • debug 打印全部的日志,详细的信息,通常只出现在诊断问题上

级别排序:critical >error>warning>info>debug

logging模块

  • python程序里自带的logging模块
  • logging模块可以记录日志到控制台或日志文件里,比print更好的输出信息,控制日志级别来控制过滤掉不需要看的信息。
  • logging模块输出日志到控制台和日志文件里的步骤
  • 创建一个日志器对象(Logger)
  • 创建一个日志句柄(Handler),用于输出到控制台
  • 再创建一个日志句柄(Handler),用于输出到文件
  • 添加这两个句柄到日志器对象(Logger)里
  • 调用日志器对象(Logger)方法完成日志记录

日志模块四大组件

Selenium37-加入日志_句柄

四大组件关系

  • 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,例如文件、网络等
  • 不同的处理器(handler)可以将日志输出到不同的位置
  • 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置
  • 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤
  • 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方

日志常用的格式

Selenium37-加入日志_句柄_02

定义日志代码

# coding:utf-8
# 导入模块
import logging,time,os
# 定义日志保存本地的路径
# log_path = "D:\\test\\newp\\report"
log_path="../logs/"


class MyLog:
# 定义日志工具类构造方法
def __init__(self):
# 文件的命名
self.logname = os.path.join(log_path, '%s.log'%time.strftime('log%Y%m%d'))
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
# 日志输出格式
self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s[line:%(lineno)d] - fuc:%(funcName)s- %(levelname)s: %(message)s')

def writelog(self, level, message):
# 创建一个FileHandler,用于写到本地
fh = logging.FileHandler(self.logname, 'a',encoding='utf-8') # 追加模式
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)

# 创建一个StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)

if level == 'info':
self.logger.info(message)
elif level == 'debug':
self.logger.debug(message)
elif level == 'warning':
self.logger.warning(message)
elif level == 'error':
self.logger.error(message)
# 这两行代码是为了避免日志输出重复问题
self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
# 关闭打开的文件
fh.close()

def info(self, message):
self.writelog('info', message)

def debug(self, message):
self.writelog('debug', message)

def warning(self, message):
self.writelog('warning', message)

def error(self, message):
self.writelog('error', message)

log = MyLog()
if __name__ == "__main__":
log.info("---测试开始----")
log.info("输入密码")
log.warning("----测试结束----")

导入日志模块

  • 在Selenium基础模块里调用日志模块记录日志信息:
    from utils.logger import log

给登录模块测试代码增加日志

Selenium37-加入日志_句柄_03

查看日志文件

logs目录中 log年月日.log

Selenium37-加入日志_日志文件_04



作者:暄总-tester