loguru:优雅的日志管理模块
2024年10月28日大约 3 分钟
loguru:优雅的日志管理模块
1. loguru的基本介绍
1.安装
pip install loguru
2.日志等级
等级 | 方法 |
---|---|
TRACE | logger.trace() |
DEBUG | logger.debug() |
INFO | logger.info() |
SUCESS | logger.sucess() |
WARNING | logger.warnning() |
ERROR | logger.error() |
CRITICAL | logger.critical() |
3.基本使用
- loguru基本使用
from loguru import logger
logger.debug('这是一条debug测试信息')
logger.info('这是一条info测试信息')
logger.warning('这是一条warning测试信息')
logger.error('这是一条error测试信息')
# 日志输入到文件
from loguru import logger
logger.add('runlog.log'.encoding='utf-8')
logger.debug('这是一条debug测试信息')
logger.info('这是一条info测试信息')
logger.warning('这是一条warning测试信息')
logger.error('这是一条error测试信息')
- 常用参数配置
# rotation配置
from loguru import logger
# 超过50M自动分割文件
logger.add('runlog.log', rotation="50 MB", encoding='utf-8')
# 文件名中加入时间
logger.add('runlog_{time}.log', rotation="50 MB", encoding='utf-8')
# 每天固定时间定时创建文件 HH:mm
logger.add('runtime_{time}.log', rotation='08:00', encoding='utf-8')
# 每隔一段时间创建文件
logger.add('runtime_{time}.log', rotation='1 week', encoding='utf-8')
# 日志保留时间,到期自动删除
from loguru import logger
logger.add('runlog_{time}.log', retention='3 days', encoding='utf-8')
# 保留压缩
from loguru import logger
logger.add('runlog_{time}.log', compression='zip', encoding='utf-8')
- 详细参数配置:见源码
2. loguru模块的简单封装
import os
import sys
import time
sys.path.append(os.getcwd())
log_time = time.strftime("%Y%m%d%H-%M", time.localtime())
from loguru import logger
log_path = os.path.dirname(__file__)+"/a.log"
retention = "15 days"
class Logger:
def __init__(self, need_log=True):
self.my_logger = logger
# 判断是否需要写入日志
if need_log is True:
self.my_logger.add(log_path, encoding='utf-8', retention=retention)
def info(self, content):
self.my_logger.info(content)
def debug(self, content):
self.my_logger.debug(content)
def error(self, content):
self.my_logger.error(content)
def critical(self, content):
self.my_logger.critical(content)
def warning(self, content):
self.my_logger.warning(content)
def success(self, content):
self.my_logger.success(content)
def trace(self, content):
self.my_logger.trace(content)
def traceback(self):
import traceback
self.my_logger.error(f'执行失败!!!失败信息:\n {traceback.format_exc()}')
logger = Logger()
if __name__ == '__main__':
print(log_path)
logger.info("hello world")
3. 装饰器结合loguru的简单应用
# ******
logger = Logger()
def wrapper_log(func):
"""
无参装饰器,也可以写成有参装饰器,True或Flase标记是否调用日志模块
功能一:执行失败,打印并记录错误日志信息,定位bug
功能二:记录用例执行时间
"""
from functools import wraps
import time
@wraps(func) # wraps 使 inner装的更像一个func
def inner(*args, **kwargs):
logger.info(f'{func.__name__}用例执行开始')
logger.info(f'正在初始化环境......')
now1 = time.time()
try:
func(*args, **kwargs)
except Exception as e:
logger.error(f'用例执行失败,失败原因:{e}')
logger.traceback()
raise e
now2 = time.time()
logger.success(f'{func.__name__}用例执行成功!!!,用例执行用时:{now2 - now1}ms')
return func
return inner
# 结合语法糖执行用例
@wrapper_log
def test_demo():
print(1 / 0)
if __name__ == '__main__':
test_demo()
4. 日志的简单应用一
- 封装并标记底层代码
#打开网址
def open(self,url):
logger.info("正在访问:{}".format(url))
self.driver.get(url)
#点击元素
def click(self,loc):
logger.info('正在点击元素:{};'.format(loc))
ele=self.find_element(loc)
if ele:
ele.click()
#输入
def input(self,loc,value):
logger.info('正在输入元素:{};'.format(value))
ele=self.find_element(loc)
if ele:
ele.clear()
ele.send_keys(value)
#退出浏览器
def quit(self):
logger.info('正在退出浏览器')
self.driver.quit()
#关闭页面标签
def close(self):
logger.info('正在关闭浏览器标签')
self.driver.close()
- 运行日志部分结果:
5. 日志的简单应用二
- 封装并标记底层代码
from logertools import logger
class RequestsT:
def __init__(self) -> None:
self.headers= {
"Content-Type":"application/json;charset=UTF-8"
}
def request(self,url=None,method='post',datas=None,params=None):
logger.info(f'请求参数:url:{url},method:{method},headers:{self.headers}')
logger.info(f'请求参数:datas:{datas},params:{params}')
import requests
res=requests.request(
url=url,
method=method,
headers=self.headers,
json=datas,
params=params
)
logger.info(f'相应内容:{res.json()}')
logger.info(str(f'断言内容:{res.status_code}==200'))
assert res.status_code==200
logger.info
return res
requests=RequestsT()
- 测试用例层
import sys,os
sys.path.append(os.path.dirname(__file__))
from requestools import requests
import pytest
from logtest import wrapper_log
con={
'url': r'http://172.17.230.127:8180/my-web/service'
}
@wrapper_log
def test_creat_bufferid():
url=con['url']+'/v2/store/ago/create?storeCode=4846'
res=requests.request(url=url)
id=res.json().get('data').get('id')
con['bufferid']=res.json().get('data').get('id')
@wrapper_log
def test_query_goods():
url=con['url']+'/v2/store/ago/line/edit/query'
headers={"Content-Type":"application/json;charset=UTF-8"}
params={
"storeCode":"4846",
"bufferId": con['bufferid'],
"goodsInputCode":'06230',
"reqDate":"2021-11-15 00:00:00",
"lineId":""
}
res=requests.request(url,params=params)
- 测试成功用例部分结果
- 测试失败用例部分结果