feat: 初始化FastAPI项目基础框架

添加项目基础结构,包括:
- 核心模块(src/main.py)
- 路由模块(users/items)
- 数据库配置和模型
- 日志工具
- 测试用例
- 项目文档和依赖配置
This commit is contained in:
2025-12-15 11:34:24 +08:00
commit 3a5cc50d02
20 changed files with 1157 additions and 0 deletions

179
src/utils/logger.py Normal file
View File

@@ -0,0 +1,179 @@
"""
日志工具模块
该模块提供了完整的日志记录功能,包括:
1. 控制台日志输出
2. 数据库日志存储
3. 异常信息捕获和记录
4. 不同日志级别的记录函数
日志信息会被同时输出到控制台和存储到数据库中,便于问题排查和系统监控。
"""
import sys
import os
import logging
import traceback
from typing import Optional
from datetime import datetime
# 将项目根目录添加到 Python 路径中,确保可以正确导入项目模块
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from src.db.database import get_db
from src.db.models import Log
# 配置基础日志设置
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 创建模块级日志记录器
logger = logging.getLogger(__name__)
def log_to_database(
level: str,
message: str,
module: str,
function: Optional[str] = None,
traceback_info: Optional[str] = None,
request_url: Optional[str] = None,
request_method: Optional[str] = None,
user_agent: Optional[str] = None,
ip_address: Optional[str] = None,
user_id: Optional[int] = None
):
"""
将日志信息保存到数据库
参数:
- level: 日志级别 (INFO, WARNING, ERROR, DEBUG)
- message: 日志消息内容
- module: 产生日志的模块名
- function: 产生日志的函数名(可选)
- traceback_info: 异常堆栈信息(可选)
- request_url: 请求URL可选
- request_method: 请求方法(可选)
- user_agent: 用户代理信息(可选)
- ip_address: IP地址可选
- user_id: 用户ID可选
"""
try:
# 获取数据库会话
db_generator = get_db()
db = next(db_generator)
# 创建日志条目对象
log_entry = Log(
level=level,
message=message,
module=module,
function=function,
traceback=traceback_info,
request_url=request_url,
request_method=request_method,
user_agent=user_agent,
ip_address=ip_address,
user_id=user_id
)
# 保存到数据库
db.add(log_entry)
db.commit()
db.refresh(log_entry)
db.close()
except Exception as e:
# 如果数据库记录失败,至少打印到控制台
logger.error(f"Failed to log to database: {str(e)}")
def capture_exception(
exception: Exception,
module: str,
function: Optional[str] = None,
request_url: Optional[str] = None,
request_method: Optional[str] = None,
user_agent: Optional[str] = None,
ip_address: Optional[str] = None,
user_id: Optional[int] = None
):
"""
捕获并记录异常信息
参数:
- exception: 捕获到的异常对象
- module: 产生异常的模块名
- function: 产生异常的函数名(可选)
- request_url: 请求URL可选
- request_method: 请求方法(可选)
- user_agent: 用户代理信息(可选)
- ip_address: IP地址可选
- user_id: 用户ID可选
"""
# 获取异常堆栈信息
tb_str = ''.join(traceback.format_exception(type(exception), exception, exception.__traceback__))
# 记录错误日志到数据库和控制台
log_to_database(
level="ERROR",
message=str(exception),
module=module,
function=function,
traceback_info=tb_str,
request_url=request_url,
request_method=request_method,
user_agent=user_agent,
ip_address=ip_address,
user_id=user_id
)
# 同时打印到控制台
logger.error(f"[{module}] {str(exception)}", exc_info=True)
def info(message: str, module: str, function: Optional[str] = None):
"""
记录INFO级别日志
参数:
- message: 日志消息内容
- module: 产生日志的模块名
- function: 产生日志的函数名(可选)
"""
logger.info(f"[{module}] {message}")
log_to_database("INFO", message, module, function)
def warning(message: str, module: str, function: Optional[str] = None):
"""
记录WARNING级别日志
参数:
- message: 日志消息内容
- module: 产生日志的模块名
- function: 产生日志的函数名(可选)
"""
logger.warning(f"[{module}] {message}")
log_to_database("WARNING", message, module, function)
def error(message: str, module: str, function: Optional[str] = None):
"""
记录ERROR级别日志
参数:
- message: 日志消息内容
- module: 产生日志的模块名
- function: 产生日志的函数名(可选)
"""
logger.error(f"[{module}] {message}")
log_to_database("ERROR", message, module, function)
def debug(message: str, module: str, function: Optional[str] = None):
"""
记录DEBUG级别日志
参数:
- message: 日志消息内容
- module: 产生日志的模块名
- function: 产生日志的函数名(可选)
"""
logger.debug(f"[{module}] {message}")
log_to_database("DEBUG", message, module, function)