log日志+中间件+注释

This commit is contained in:
2026-09-23 09:28:16 +08:00
parent 1abb8ab737
commit 0065eaa6f7
9 changed files with 365 additions and 70 deletions
+90
View File
@@ -0,0 +1,90 @@
# ============================================================
# 日志工具类 — 对标准库 logging 进行简单封装
# 提供控制台输出、文件输出、统一 message() 记录三个能力
# 避免在各处重复写 logger.handlers / FileHandler / Formatter 等样板代码
# ============================================================
import logging
class Log:
"""
简易日志封装类。
用法示例:
log = Log('myapp', 'INFO')
log.logFile('app.log') # 输出到文件
log.logConsol() # 同时输出到控制台
log.message('info', '启动成功')
设计要点:
- 同一日志器重复 addHandler 会导致同一条日志输出多次,
所以 logFile / logConsol 里做了 handler 去重判断。
"""
def __init__(self, name, lv):
"""
构造日志器实例。
参数:
name: 日志器名称,同名日志器是全局单例(logging.getLogger 内部维护)
lv: 初始日志级别字符串,不区分大小写
可选值: 'DEBUG' / 'INFO' / 'WARNING' / 'ERROR' / 'CRITICAL'
"""
# ① 创建命名日志器
self.logName = logging.getLogger(name)
# ② 设置日志级别(字符串转 logging.XXX 枚举)
self.logName.setLevel(eval(f'logging.{lv.upper()}'))
# ④ 定义统一的日志输出格式:时间 - 名称 - 级别 - 消息
self.formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 保存现有 handler 列表,方便后续去重
self.handlers = self.logName.handlers
def logConsol(self):
"""将日志输出到控制台(stdout)。"""
con_hand = logging.StreamHandler() # ③ 创建控制台处理器
con_hand.setFormatter(self.formatter) # 绑定格式
# 去重:避免重复添加同一个类型的 handler 导致日志重复打印
if 'StreamHandler' not in str(self.handlers):
self.logName.addHandler(con_hand) # ⑤ 注册到日志器
def logFile(self, fileName):
"""
将日志输出到指定文件(UTF-8 编码)。
参数:
fileName: 日志文件名,例如 'log.txt'
"""
file_hand = logging.FileHandler(fileName, encoding='utf-8') # ③ 创建文件处理器
file_hand.setFormatter(self.formatter)
# 去重:同一个文件 handler 只注册一次
if 'FileHandler' not in str(self.handlers):
self.logName.addHandler(file_hand) # ⑤ 注册到日志器
def message(self, lv, mes):
"""
按照指定级别输出一条日志。
参数:
lv: 日志级别字符串(不区分大小写),可选 debug / info / warning / error / critical
mes: 日志内容
"""
lv = lv.lower()
if lv == 'debug':
self.logName.debug(mes)
elif lv == 'info':
self.logName.info(mes)
elif lv == 'warning':
self.logName.warning(mes)
elif lv == 'error':
self.logName.error(mes)
elif lv == 'critical':
self.logName.critical(mes)
else:
print('请输入正确的日志级别!')