selenium之日志架构
1.什么是日志
跟踪软件运行时事件的方法(跟踪文档)
日志作用:
- 服务诊断
- 信息查询
- 数据分析
2.python实现日志收集
1)logging模块 python底层封装的基本常用 内置模块 不需要安装
Logging模块四大组件:
1、 日志器 logger 提供日志入口
2、 处理器 handler 日志怎么实现输出?日志可以写在文档里,那还在哪里输出呢?控制台输出,在不同的情况下,还需要把日志以邮件的方式输出
3、 格式器 formater 决定日志输出的格式及内容
4、 过滤器 filter在不同场景对应不同日志的输出,只保留最感兴趣的日志内容
2)日志级别
问题:把项目部署到开发环境或者生产环境,生成的日志是一样的吗?
日志越详细对定位问题越有帮助,在开发环境有必要,但是在生产环境,如果收集的日志越多,会给服务器输入输出增大压力,从而可能让整个项目的性能受限,其次生成的日志越多也会干扰到我们去排查问题。所以需要结合不同的场景、不同的情况去做具体的分析,并不是说在任何时候需要把所有时候做的所有事情都记录下来。
怎么样在不同场景输出对应的不同等级的日志?
功能也有等级
日志级别从低到高:
1、 debug等级 用来调试
2、 info 关键事件的描述
3、 warning 警告
4、 error 错误
5、 critical严重
生产环境应该输出哪些日志等级?4、5等级的日志
开发环境应该输出哪些日志?1、2、3、4、5所有日志输出
如何把日志整合到自动化框架设计
1) 登录 收集什么样的信息 元素加载没完成、元素变更,导致用例定位不到
简化代码,提供代码复用性
代码扩展性、可维护性
3.实战:
import logging
import os
class FramLog:
#将日志输出到Console
def get_log(self):
#创建日志器
logger=logging.getLogger('logger')
#设置日志器的等级 不设置的话,默认warning级别及以上会输出,debug、info级别不输出
#这里进行自定义INFO
logger.setLevel(logging.DEBUG)
# logger.setLevel(logging.INFO)
#创建控制台处理器
sh=logging.StreamHandler()
#创建格式器
#日志里面包含哪些内容:时间 文件名 行 日志等级 事件描述 s表示字符串格式 d数字类型
formater=logging.Formatter(fmt="%(asctime)s [%(filename)s:%(lineno)d] [%(levelname)s] :%(message)s ",
datefmt="%Y-%m-%d %X")
#一个日志器可以有多个处理器,并且每个处理器可以有各自的格式器和过滤器
logger.addHandler(sh)
sh.setFormatter(formater)
return logger
#将日志输出到文件
def log_file(self,level,message):
logfile = os.getcwd().split('public')[0] + "log/error" + ".log"
# 创建logger
logger = logging.getLogger('logger')
# 设置logger日志级别,设置日志级别后,可以输出设计级别以上级别的日志,默认warning级别
logger.setLevel(logging.DEBUG) # DEBUG级别以上可以输出
# 创建handler,将日志输出到文件中
handler = logging.FileHandler(logfile, "a") # a表示追加模式
# 定义formatter
formatter = logging.Formatter(fmt="%(asctime)s [%(filename)s:%(lineno)d] [%(levelname)s] :%(message)s ",
datefmt="%Y-%m-%d %X")
# 给handler添加formatter
handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(handler)
# 根据传入的level实现不同日志级别的输出
if level == "debug":
logger.debug(message)
elif level == "info":
logger.info(message)
elif level == "warning":
logger.warning(message)
elif level == "error":
logger.error(message)
# 避免日志的重复输出
logger.removeHandler(handler)
handler.close() # 关闭打开的文件
def log_debug(self, message):
self.log_file("debug", message)
def log_info(self, message):
self.log_file("info", message)
def log_warning(self, message):
self.log_file("warning", message)
def log_error(self, message):
self.log_file("error", message)
if __name__ == '__main__':
FramLog().log_error('这个一个报错日志')