24. 日志的基本实现方式
Python日志系统实战:从配置到验证的全流程解析
一、代码结构解析
1.1 核心配置参数
LOG_FORMATTER = ('%(asctime)s - %(name)s - %(levelname)s - %(status)s - %(message)s','%H:%M:%S') # ⚠️注意:自定义字段需要特殊处理
LOG_NAME = r'demo_log'
LOG_FILE = r'./demo.log'
LOG_LEVEL = logging.DEBUG
参数名称 | 推荐配置 | 注意事项 |
---|---|---|
LOG_FORMATTER | 包含时间/名称/级别 | 需处理自定义字段 |
LOG_FILE | 绝对路径更安全 | 注意文件权限问题 |
1.2 函数实现解析
def creat_logger(...): # ⚠️拼写建议:create_logger"""..."""formatter = logging.Formatter(*log_formatter) # ✅正确展开格式元组handler = logging.FileHandler(log_file) # ⚠️建议添加文件模式参数handler.setFormatter(formatter)logger = logging.getLogger(log_name)logger.setLevel(log_level) # ✅正确设置日志层级logger.addHandler(handler)return logger
二、测试验证流程
2.1 基础测试用例
# 正常日志测试
log.debug("系统启动", extra={"status": "OK"})
log.info("用户登录", extra={"status": "SUCCESS"})# 异常场景测试
try:1/0
except Exception as e:log.error("计算错误", exc_info=True, extra={"status": "FAILURE"})
2.2 预期输出示例
15:30:45 - demo_log - DEBUG - OK - 系统启动
15:30:45 - demo_log - INFO - SUCCESS - 用户登录
15:30:45 - demo_log - ERROR - FAILURE - 计算错误
Traceback (most recent call last):File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
三、关键问题说明
3.1 注意事项
- 自定义字段处理:
status
字段需要配合Filter使用class StatusFilter(logging.Filter):def filter(self, record):record.status = getattr(record, 'status', 'UNKNOWN')return True
- 路径安全问题:建议使用绝对路径
import os LOG_FILE = os.path.abspath('./demo.log')
3.2 改进建议
# 改进后的Handler配置
handler = logging.FileHandler(log_file, mode='a', # 明确写入模式encoding='utf-8' # 指定编码格式
)
四、完整执行流程
- 保存代码为
logger_demo.py
- 创建测试脚本:
from logger_demo import log # 执行2.1的测试用例
- 验证输出文件:
tail -f demo.log # Linux Get-Content demo.log -Wait # PowerShell
五、完整代码
"""
Python :3.13.3
Selenium: 4.31.0lgos.py
"""import loggingLOG_FORMATTER = ('%(asctime)s - %(name)s - %(levelname)s - %(status)s - %(message)s','%H:%M:%S')LOG_NAME = r'demo_log'
LOG_FILE = r'./demo.log'
LOG_LEVEL = logging.DEBUGdef creat_logger(log_name: str = LOG_NAME,log_file: str = LOG_FILE,log_level: int = LOG_LEVEL,log_formatter: tuple = LOG_FORMATTER):"""日志配置和生成器:param log_name: 日志名称:param log_file: 日志文件的路径:param log_level: 日志等级:param log_formatter: 日志的格式:return:"""formatter = logging.Formatter(*log_formatter)handler = logging.FileHandler(log_file)handler.setFormatter(formatter)logger = logging.getLogger(log_name)logger.setLevel(log_level)logger.addHandler(handler)return loggerlog = creat_logger()
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀