日志处理:
怎么定位问题,怎么调试问题
1、print
2、断点调试,debug
3、 线上环境加日志
日志:
时间 正常 运行了某行代码
时间 重要 记录异常信息 – 发邮件或短信通知
需要安装第三方库 loguru
日志:
from loguru import logger
logger.info("正常日志记录")
try:
a = [1, 2, 3]
a[12]
except Exception as e:
logger.error(e)
import unittest
from loguru import logger
class TestDemo(unittest.TestCase):
def test_add(self):
try:
self.assertTrue(1 + 1 == 3)
except AssertionError as e:
logger.error(f"断言失败:{e}")
# 需要手动抛出异常,否则会用例执行通过
raise e
from loguru import logger
def login(username, passwd):
"""登录功能,开发写的"""
response = {"messege": None,
"code": None,
"token": None}
if username == "h" and passwd == "1234":
response["messege"] = "succes"
response["code"] = 200
response["token"] = "good token"
return response
if username == "":
response["messege"] = "用户名为空"
response["code"] = 400
return response
if passwd == "":
response["messege"] = "密码为空"
response["code"] = 400
return response
else:
response["messege"] = "用户名或密码错误"
response["code"] = 400
return response
case1 = {"username": "h",
"passwd": "1234",
"expected": {'messege1': 'succes', 'code': 200, 'token': 'good token'}
}
case2 = {"username": "",
"passwd": "1234",
"expected": {'messege': '用户名为空', 'code': 400, 'token': None}
}
case3 = {"username": "h",
"passwd": "",
"expected": {'messege': '密码为空', 'code': 400, 'token': None}
}
case4 = {"username": "hk",
"passwd": "6666",
"expected": {'messege': '用户名或密码错误', 'code': 400, 'token': None}
}
import unittest
class TestLogin(unittest.TestCase):
# 类级别的
@classmethod
def setUpClass(cls) -> None:
pass
# print("每个类执行一次的前置")
@classmethod
def tearDownClass(cls) -> None:
pass
# print("每个类执行一次的后置")
# 用例级别的
def setUp(self) -> None:
"""前置操作,每个用例之前执行一遍"""
# print("连接数据库...")
pass
def tearDown(self) -> None:
"""后置操作,每个用例之后执行一遍"""
# print("断开数据库...")
pass
def test_login(self):
logger.info("将执行被测试的函数")
actual = login(case1["username"], case1["passwd"])
logger.info("执行函数结束,得到实际结果")
expected = case1["expected"]
# 断言是否相等
logger.info("正在断言...")
try:
self.assertEqual(expected, actual)
except AssertionError as e:
logger.error(f"断言失败:{e}")
# 手工抛出异常
raise e
def test_login_2(self):
actual = login(case2["username"], case2["passwd"])
expected = case2["expected"]
print(actual)
self.assertEqual(expected, actual)
日志保存到文件中:
import unittest
from loguru import logger
# 把日志保存到文件中
logger.add(sink="py53.log", encoding="utf-8",level="INFO",
# 当文件太大时,创建新的文件
rotation="100 MB")
# 本地的调试环境
# logger.add(sink="py53.log", encoding="utf-8",level="DEBUG")
class TestDemo(unittest.TestCase):
def test_add(self):
try:
logger.info("正在断言...")
self.assertTrue(1 + 1 == 3)
except AssertionError as e:
logger.error(f"断言失败:{e}")
# 需要手动抛出异常,否则会用例执行通过
raise e
自己实现loguru(了解):
# 标准库:自带的 unittest
import logging
# 设置日志的等级
# logging.basicConfig(level="INFO")
# logging.info("这是标准日志")
# logging.warning("这是警告日志")
# logging.error("这是错误日志")
# 完整的 logging 流程
# 日志收集器, 笔
logger = logging.getLogger("py53")
logger.setLevel("DEBUG") # 设置级别
# 日志处理器,显示日记的, 本子
handler = logging.StreamHandler()
handler.setLevel("DEBUG") # 设置级别
logger.addHandler(handler) # 把 笔和本子绑定在一起
# 文件处理器,通过文件保存日志, 另外一个本子
file_handler = logging.FileHandler(filename="my.log", encoding="utf-8")
file_handler.setLevel("DEBUG")
logger.addHandler(file_handler)
# 设置 日志格式
fmt = logging.Formatter("%(asctime)s | %(levelname)s | %(filename)s:%(lineno)d - %(message)s")
handler.setFormatter(fmt)
file_handler.setFormatter(fmt)
logger.debug("调试...")
logger.info("这是标准日志")
logger.warning("这是警告日志")
logger.error("这是错误日志")
封装:
import logging
def get_logger(name="root",level="DEBUG",filename=None,
formatter="%(asctime)s | %(levelname)s | %(filename)s:%(lineno)d - %(message)s"):
# 完整的 logging 流程
# 日志收集器, 笔
logger = logging.getLogger(name)
logger.setLevel(level) # 设置级别
# 日志处理器,显示日记的, 本子
handler = logging.StreamHandler()
handler.setLevel(level) # 设置级别
logger.addHandler(handler) # 把 笔和本子绑定在一起
# 设置 日志格式
fmt = logging.Formatter(formatter)
handler.setFormatter(fmt)
if filename != None:
# 文件处理器,通过文件保存日志, 另外一个本子
file_handler = logging.FileHandler(filename=filename, encoding="utf-8")
file_handler.setLevel(level)
logger.addHandler(file_handler)
# 设置 日志格式
file_handler.setFormatter(fmt)
return logger
from PyTest08.Test15_1 import get_logger
logger = get_logger()
logger.debug("调试...")
logger.info("这是标准日志")
logger.warning("这是警告日志")
logger.error("这是错误日志")