feat: 初始化FastAPI项目基础框架
添加项目基础结构,包括: - 核心模块(src/main.py) - 路由模块(users/items) - 数据库配置和模型 - 日志工具 - 测试用例 - 项目文档和依赖配置
This commit is contained in:
179
src/utils/logger.py
Normal file
179
src/utils/logger.py
Normal 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)
|
||||
Reference in New Issue
Block a user