上一小节我们讲解了文件读写方法的封装方法,本小节我们完成一下框架日志的封装方法。
首先我们讲解一下日志封装和日志记录有哪些用处?
- 更加方便的设置日志的格式和输出方式
- 全局方法可以各个类/函数中都能统一调用
- 分类记录接口用例执行日志,方便嵌入测试报告
- 错误日志提示,方便代码调试或者做群消息告警
新建log.py
#log.py
import logging
import os
from datetime import datetime
class LoggerHandler(logging.Logger):
def __init__(self, name, level, format_string=None):
super().__init__(name, level=level)
self._set_format(format_string)
self._add_file_handler(level)
self._add_stream_handler(level)
def _set_format(self, format_string):
"""设置日志格式"""
formatter = logging.Formatter(format_string or "%(asctime)s - %(levelname)s - %(message)s")
for handler in self.handlers:
handler.setFormatter(formatter)
def _add_file_handler(self, level):
"""添加文件处理器"""
# 获取脚本所在目录的根路径
root = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))))
# 创建日志目录
log_directory = os.path.join(root, "logs")
os.makedirs(log_directory, exist_ok=True)
# 获取当前时间戳,并格式化为字符串
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 构造日志文件名
log_file_name = f"{current_time}.log"
log_file_path = os.path.join(log_directory, log_file_name)
file_handler = logging.FileHandler(log_file_path, mode="w", encoding='utf-8')
file_handler.setLevel(level)
self.addHandler(file_handler)
def _add_stream_handler(self, level):
"""添加流处理器"""
stream_handler = logging.StreamHandler()
stream_handler.setLevel(level)
self.addHandler(stream_handler)
# 初始化LoggerHandler
logger = LoggerHandler(
name="Logger",
level=logging.INFO,
format_string="%(asctime)s -- %(levelname)s -- %(filename)s -- %(funcName)s -- %(message)s"
)
# 示例:记录一条日志
logger.info("This is an info message.")
代码逻辑讲解如下:
- 一个类LoggerHandler继承python自带的logging模块
- _set_format方法用于设置日志的格式,日志格式是一个字符串
- _add_file_handler方法用于将日志输出到log文件中记录,具体逻辑是先创建输出的目录路径,再是设置日志文件的名称,最后添加到文件处理器中即可self.addHandler(file_handler)
- _add_stream_handler方法用于将日志输出到终端控制台,添加流处理器即可 self.addHandler(stream_handler)
以上就是框架日志的封装方法,大家也可以自己打印一些日志,练习一下!