You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9.9 KiB
9.9 KiB
日志系统迁移 - 阶段 2 准备就绪
日期: 2026-01-29
类型: 迁移准备
影响范围: 服务层(5 个文件)
概述
阶段 1(核心模块)已完成并验证通过。现在准备执行阶段 2 - 服务层迁移。
阶段 2 文件清单
| # | 文件路径 | 行数 | 日志调用数 | 复杂度 | 状态 |
|---|---|---|---|---|---|
| 1 | app/services/payment_service.py |
~100 | 8 | 中 | ⏳ 待执行 |
| 2 | app/services/payment/wechat_payment.py |
~80 | 6 | 中 | ⏳ 待执行 |
| 3 | app/services/payment/alipay_payment.py |
~80 | 6 | 中 | ⏳ 待执行 |
| 4 | app/services/recharge_service.py |
~350 | 15 | 高 | ⏳ 待执行 |
| 5 | app/services/attachment_service.py |
~400 | 10 | 高 | ⏳ 待执行 |
总计: 5 个文件,约 1010 行代码,45 处日志调用
执行步骤
步骤 1: 创建备份
# 备份所有待迁移文件
cp server/app/services/payment_service.py server/app/services/payment_service.py.bak
cp server/app/services/payment/wechat_payment.py server/app/services/payment/wechat_payment.py.bak
cp server/app/services/payment/alipay_payment.py server/app/services/payment/alipay_payment.py.bak
cp server/app/services/recharge_service.py server/app/services/recharge_service.py.bak
cp server/app/services/attachment_service.py server/app/services/attachment_service.py.bak
echo "✅ 备份完成"
步骤 2: 执行迁移
文件 1: app/services/payment_service.py
需要替换的内容:
# 第 6 行 - 导入语句
# Before:
from loguru import logger
# After:
import logging
logger = logging.getLogger(__name__)
日志调用替换(8 处):
| 行号 | Before | After |
|---|---|---|
| 23 | logger.info("PaymentService 初始化成功") |
logger.info("PaymentService 初始化成功") |
| 48-50 | logger.info(f"创建支付订单: order_no={order_no}, amount={amount}元, payment_method={payment_method}, description={description}") |
logger.info("创建支付订单: order_no=%s, amount=%.2f元, payment_method=%s, description=%s", order_no, amount, payment_method, description) |
| 58 | logger.error(error_msg) |
logger.error("不支持的支付方式: %s", payment_method) |
| 62 | logger.error(f"创建支付订单失败: order_no={order_no}, error={str(e)}") |
logger.error("创建支付订单失败: order_no=%s", order_no, exc_info=True) |
| 79 | logger.info(f"验证支付回调: payment_method={payment_method}, order_no={order_no}") |
logger.info("验证支付回调: payment_method=%s, order_no=%s", payment_method, order_no) |
| 87 | logger.warning(f"不支持的支付方式: {payment_method}") |
logger.warning("不支持的支付方式: %s", payment_method) |
| 90 | logger.error(f"验证回调签名失败: payment_method={payment_method}, error={str(e)}") |
logger.error("验证回调签名失败: payment_method=%s", payment_method, exc_info=True) |
文件 2-3: app/services/payment/wechat_payment.py 和 alipay_payment.py
相同的替换模式:
# 导入语句
from loguru import logger
→
import logging
logger = logging.getLogger(__name__)
# 日志调用
logger.info(f"调用微信支付 API: {order_no}, {amount}元")
→
logger.info("调用微信支付 API: order_no=%s, amount=%.2f元", order_no, amount)
logger.error(f"微信支付订单创建失败: {order_no}, {message}")
→
logger.error("微信支付订单创建失败: order_no=%s, code=%s, message=%s", order_no, code, message)
logger.error(f"微信支付回调验证失败: {str(e)}")
→
logger.error("微信支付回调验证失败", exc_info=True)
文件 4: app/services/recharge_service.py
需要替换的内容(15 处日志调用):
# 导入语句(第 14 行)
from loguru import logger
→
import logging
logger = logging.getLogger(__name__)
# 主要日志调用模式
logger.info(f"创建充值订单: user_id={user_id}, package_id={package_id}, amount={amount}, payment_method={payment_method}")
→
logger.info("创建充值订单: user_id=%s, package_id=%s, amount=%s, payment_method=%s", user_id, package_id, amount, payment_method)
logger.error(f"创建支付失败: {str(e)}")
→
logger.error("创建支付失败", exc_info=True)
logger.info(f"充值订单创建成功: {order_no}")
→
logger.info("充值订单创建成功: order_no=%s", order_no)
文件 5: app/services/attachment_service.py
需要替换的内容(10 处日志调用):
# 导入语句(第 11 行)
from loguru import logger
→
import logging
logger = logging.getLogger(__name__)
# 主要日志调用模式
logger.info(f"上传附件: user_id={user_id}, filename={file.filename}, related_type={related_type}, purpose={attachment_purpose}")
→
logger.info("上传附件: user_id=%s, filename=%s, related_type=%s, purpose=%s", user_id, file.filename, related_type, attachment_purpose)
logger.info(f"附件上传成功: {created_attachment.attachment_id}")
→
logger.info("附件上传成功: attachment_id=%s", created_attachment.attachment_id)
logger.info(f"附件删除成功: {attachment_id}")
→
logger.info("附件删除成功: attachment_id=%s", attachment_id)
步骤 3: 验证语法
# 验证所有迁移的文件
python -m py_compile server/app/services/payment_service.py
python -m py_compile server/app/services/payment/wechat_payment.py
python -m py_compile server/app/services/payment/alipay_payment.py
python -m py_compile server/app/services/recharge_service.py
python -m py_compile server/app/services/attachment_service.py
# 检查是否有语法错误
if [ $? -eq 0 ]; then
echo "✅ 所有文件语法检查通过"
else
echo "❌ 语法检查失败,请检查错误信息"
fi
步骤 4: 检查进度
# 检查残留的 loguru 引用
grep -r "from loguru import" server/app/ | wc -l
# 应该显示: 14 (19 - 5 = 14)
步骤 5: 运行测试(可选)
# 如果有相关测试,运行它们
pytest server/tests/unit/test_payment_service.py -v
pytest server/tests/unit/test_recharge_service.py -v
pytest server/tests/unit/test_attachment_service.py -v
替换模式总结
模式 1: 导入语句
# Before
from loguru import logger
# After
import logging
logger = logging.getLogger(__name__)
模式 2: 简单信息日志
# Before
logger.info(f"操作成功: {value}")
# After
logger.info("操作成功: %s", value)
模式 3: 多参数日志
# Before
logger.info(f"用户 {user_id} 创建订单 {order_no}, 金额 {amount}元")
# After
logger.info("用户 %s 创建订单 %s, 金额 %.2f元", user_id, order_no, amount)
模式 4: 错误日志
# Before
logger.error(f"操作失败: {str(e)}")
# After
logger.error("操作失败", exc_info=True)
模式 5: 警告日志
# Before
logger.warning(f"警告: {message}")
# After
logger.warning("警告: %s", message)
自动化脚本(可选)
如果需要批量替换,可以使用以下 Python 脚本:
#!/usr/bin/env python3
"""
日志迁移辅助脚本
自动替换 loguru 为 logging
"""
import re
from pathlib import Path
def migrate_file(file_path: Path):
"""迁移单个文件"""
content = file_path.read_text(encoding='utf-8')
# 1. 替换导入语句
content = re.sub(
r'from loguru import logger',
'import logging\nlogger = logging.getLogger(__name__)',
content
)
# 2. 替换 f-string 日志(简单模式)
# logger.info(f"xxx {var} yyy")
# → logger.info("xxx %s yyy", var)
# 注意:这个正则表达式只处理简单情况,复杂的需要手动处理
# 3. 替换错误日志
content = re.sub(
r'logger\.error\(f"([^"]+): \{str\(e\)\}"\)',
r'logger.error("\1", exc_info=True)',
content
)
file_path.write_text(content, encoding='utf-8')
print(f"✅ 已迁移: {file_path}")
# 使用示例
files = [
Path('server/app/services/payment_service.py'),
Path('server/app/services/payment/wechat_payment.py'),
Path('server/app/services/payment/alipay_payment.py'),
Path('server/app/services/recharge_service.py'),
Path('server/app/services/attachment_service.py'),
]
for file in files:
if file.exists():
migrate_file(file)
注意: 自动化脚本只能处理简单情况,复杂的日志调用仍需手动检查和修改。
验证清单
完成迁移后,请检查以下项目:
- 所有文件的导入语句已替换
- 所有 f-string 日志已改为 %-formatting
- 所有错误日志已添加
exc_info=True - 语法检查通过
- 残留 loguru 引用数量正确(14 个)
- 相关测试通过(如果有)
- 代码审查完成
回滚方案
如果迁移出现问题,可以快速回滚:
# 恢复备份文件
mv server/app/services/payment_service.py.bak server/app/services/payment_service.py
mv server/app/services/payment/wechat_payment.py.bak server/app/services/payment/wechat_payment.py
mv server/app/services/payment/alipay_payment.py.bak server/app/services/payment/alipay_payment.py
mv server/app/services/recharge_service.py.bak server/app/services/recharge_service.py
mv server/app/services/attachment_service.py.bak server/app/services/attachment_service.py
echo "✅ 回滚完成"
下一步
完成阶段 2 后:
- 创建阶段 2 的 Changelog
- 更新进度跟踪文档
- 继续执行阶段 3(API + 仓储层)
相关文档
准备状态: ✅ 就绪
预计时间: 3 小时
建议: 建议手动执行,确保每个文件的日志调用都正确替换