1、输出到控制台
1.1日志级别
日志级别有5个级别,默认输出的是waring级别的,可以通过logging.basicConfig(level=logging.DEBUG)
对输出的级别进行设置
import logging
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG) # 配置日志级别
logging.debug('debug级别,一般用来打印一些调试信息,级别最低')
logging.info('info级别,一般用来打印一些正常的操作信息')
logging.warning('waring级别,一般用来打印警告信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')
输出
DEBUG:root:debug级别,一般用来打印一些调试信息,级别最低
INFO:root:info级别,一般用来打印一些正常的操作信息
WARNING:root:waring级别,一般用来打印警告信息
ERROR:root:error级别,一般用来打印一些错误信息
CRITICAL:root:critical级别,一般用来打印一些致命的错误信息,等级最高
1.2日志格式
可以对输出的日志格式进行设置
import logging
if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
level=logging.DEBUG) # 配置输出格式、配置日志级别
logging.debug('debug级别,一般用来打印一些调试信息,级别最低')
logging.info('info级别,一般用来打印一些正常的操作信息')
logging.warning('waring级别,一般用来打印警告信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')
输出
2024-01-25 16:19:30,409 - 111.py[line:17] - DEBUG: debug级别,一般用来打印一些调试信息,级别最低
2024-01-25 16:19:30,410 - 111.py[line:18] - INFO: info级别,一般用来打印一些正常的操作信息
2024-01-25 16:19:30,410 - 111.py[line:19] - WARNING: waring级别,一般用来打印警告信息
2024-01-25 16:19:30,410 - 111.py[line:20] - ERROR: error级别,一般用来打印一些错误信息
2024-01-25 16:19:30,410 - 111.py[line:21] - CRITICAL: critical级别,一般用来打印一些致命的错误信息,等级最高
format的内置参数有
%(name)s:Logger的名字
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息
2、输出到文件
输出日志到文件步骤:
-
1.创建日志器logging.getLogger()
-
2.设置日志级别
-
3.设置日志的格式
-
4.设置handler,handler的作用是将消息分别发送到指定的位置(如文件、控制台)
-
5.为logger增加handler,logger对象可以通过addHandler()为自己添加一个或多个handler,可以同时将日志输出到控制台、文件等,添加几种handler就会输出几种类型;
日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作
- 常用的handler
Handler 描述 logging.StreamHandler
将日志消息发送到控制台 logging.FileHandler
将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 logging.handlers.RotatingFileHandler
将日志消息发送到磁盘文件,并支持日志文件按大小切割 logging.hanlders.TimedRotatingFileHandler
将日志消息发送到磁盘文件,并支持日志文件按时间切割 logging.handlers.HTTPHandler
将日志消息以GET或POST的方式发送给一个HTTP服务器 logging.handlers.SMTPHandler
将日志消息发送给一个指定的email地址 logging.NullHandler
该Handler实例会忽略error messages
import logging
if __name__ == '__main__':
#创建日志器
logger = logging.getLogger()
# 设置日志级别
logger.setLevel(level=logging.DEBUG)
# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# 设置文件处理器,指定保存到demo2.txt文件中
file_handler = logging.FileHandler('demo2.txt')
# 设置文件处理器输出日志的级别
file_handler.setLevel(level=logging.INFO)
# 设置文件处理器日志的格式
file_handler.setFormatter(formatter)
# 设置控制台处理器
stream_handler = logging.StreamHandler()
# 设置控制台处理器输出日志的级别
stream_handler.setLevel(logging.DEBUG)
# 设置控制台处理器日志的格式
stream_handler.setFormatter(formatter)
# 为logger对象增加一个 文件handle
logger.addHandler(file_handler)
# 为logger对象增加一个 控制台handle
logger.addHandler(stream_handler)
logger.debug('debug级别,一般用来打印一些调试信息,级别最低')
logger.info('info级别,一般用来打印一些正常的操作信息')
logger.warning('waring级别,一般用来打印警告信息')
logger.error('error级别,一般用来打印一些错误信息')
logger.critical('critical级别,一般用来打印一些致命的错误信息,等级最高')
在控制台和文件中都有输出日志信息
3、代码封装
3.1封装代码
import logging
def test_log2():
# 创建日志器
logger = logging.getLogger()
# 设置日志级别
logger.setLevel(logging.INFO)
# 设置格式 创建格式器
formatter = logging.Formatter('%(asctime)s %(filename)s %(funcName)s %(levelname)s %(message)s')
# 日志信息显示在控制台
if not logger.handlers:
# 设置handler,这里设置一个控制台handler
sh = logging.StreamHandler()
# 给控制台加格式
sh.setFormatter(formatter)
# 日志信息放入控制台中
logger.addHandler(sh)
# 设置handler,这里设置一个文件handler
fh = logging.FileHandler('log1.txt', encoding='utf-8')
# 给文件handler加格式
fh.setFormatter(formatter)
# 把日志信息添加到文件中去
logger.addHandler(fh)
return logger
3.2调用
创建一个base.py文件导入上面封装好的test_log2()
类,在需要日志的代码中加上 实例化类.info
或 实例化类.error
输出日志信息
import time
from class06.demo02 import test_log2
from selenium import webdriver
a = test_log2()
class BasePage:
def __init__(self, driver):
self.driver = driver
def open(self, txt):
try:
# 记录正常的日志
a.info(f'访问{txt}')
self.driver.get(txt)
except Exception as e:
# 记录报错的日志
a.error('没有访问到网址')
def locaotr(self, name, value):
return self.driver.find_element(name, value)
def on_input(self, name, value, txt):
try:
a.info(f'通过{name}{value}输入{txt}')
self.locaotr(name, value).send_keys(txt)
except Exception as e:
a.error('输入错误了%s' % e)
def on_click(self, name, value):
a.info(f'通过{name}{value}进行了点击')
self.locaotr(name, value).click()
def wait(self):
time.sleep(3)
def close(self):
self.driver.quit()
if __name__ == '__main__':
b = BasePage(webdriver.Chrome())
b.open('http://www.baidu.com')
b.on_input('id', 'kw', '测试')
b.wait()
b.on_click('id', 'su')
b.wait()
b.close()
4、luckylog模块
luckylog可以直接使用无需封装;
安装:pip install luckylog
from selenium import webdriver
from luckylog.luckylog import *
log_conf.path = './test.log' # 设置保存的日志路径
log_conf.module = ['success', 'error', 'tip', 'warning'] # 设置需要保存那些类型的日志
log_conf.error_file = './error.log' # 设置装饰器错误信息保存路径
log_conf.detail = False
class BasePage:
def __init__(self, driver):
self.driver = driver
@logger(passed='成功打开网址', fail='失败网址')
def open(self, txt):
self.driver.get(txt)
def locaotr(self, name, value):
return self.driver.find_element(name, value)
@logger(passed='成功输入内容', fail='失败输入内容')
def on_input(self, name, value, txt):
self.locaotr(name, value).send_keys(txt)
@logger(passed='成功点击', fail='失败点击')
def on_click(self, name, value):
self.locaotr(name, value).click()
def wait(self):
time.sleep(3)
def close(self):
self.driver.quit()
if __name__ == '__main__':
b = BasePage(webdriver.Chrome())
b.open('http://www.baidu.com')
b.on_input('id', 'kw', '测试')
b.wait()
b.on_click('id', 'su')
b.wait()
b.close()