diff --git a/api/main.py b/api/main.py index e7cf4ee..ce9a8a4 100644 --- a/api/main.py +++ b/api/main.py @@ -2,22 +2,99 @@ FastAPI 应用入口 """ import os -from dotenv import load_dotenv +import logging +from pathlib import Path +from dotenv import load_dotenv, dotenv_values from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) +logger = logging.getLogger(__name__) + # 加载环境变量 -load_dotenv() +env_file = Path('.env') +env_file_exists = env_file.exists() + +if env_file_exists: + logger.info(f"正在从文件加载环境变量: {env_file.absolute()}") + # 先读取环境变量文件内容(用于日志记录) + env_vars = dotenv_values(env_file) + # 然后加载到环境变量中 + result = load_dotenv(env_file) + + # 敏感环境变量列表(只显示名称,不显示值) + sensitive_keys = ['SECRET_KEY', 'DEEPSEEK_API_KEY', 'LLM_API_KEY', 'PASSWORD', 'TOKEN', 'KEY'] + + # 记录加载的环境变量 + loaded_vars = [] + for key, value in env_vars.items(): + if value is None: + continue + if any(sensitive in key.upper() for sensitive in sensitive_keys): + # 敏感信息只显示名称和部分值 + masked_value = f"{value[:4]}...{value[-4:]}" if value and len(value) > 8 else "***" + loaded_vars.append(f"{key}={masked_value}") + else: + loaded_vars.append(f"{key}={value}") + + logger.info(f"成功加载 {len(loaded_vars)} 个环境变量:") + for var in loaded_vars: + logger.info(f" - {var}") +else: + logger.warning(f".env 文件不存在: {env_file.absolute()}") + logger.info("尝试从系统环境变量加载配置") + load_dotenv() from database import init_db from routers import websocket, chapters, books, conversations, auth # 初始化数据库 +logger.info("正在初始化数据库...") init_db() +logger.info("数据库初始化完成") + +# 记录关键配置信息 +logger.info("=== 应用配置信息 ===") +logger.info(f"数据库连接: {os.getenv('DATABASE_URL', 'sqlite:///./life_echo.db')}") +logger.info(f"JWT 算法: {os.getenv('ALGORITHM', 'HS256')}") +logger.info(f"访问令牌过期时间: {os.getenv('ACCESS_TOKEN_EXPIRE_MINUTES', '120')} 分钟") + +# LLM 配置 +if os.getenv("DEEPSEEK_API_KEY"): + logger.info("LLM 提供商: DeepSeek") + logger.info(f"DeepSeek 模型: {os.getenv('DEEPSEEK_MODEL', 'deepseek-chat')}") + logger.info(f"DeepSeek Base URL: {os.getenv('DEEPSEEK_BASE_URL', 'https://api.deepseek.com')}") +elif os.getenv("LLM_API_KEY"): + logger.info("LLM 提供商: 通用 LLM") + logger.info(f"LLM 模型: {os.getenv('LLM_MODEL', 'deepseek-chat')}") + logger.info(f"LLM Base URL: {os.getenv('LLM_BASE_URL', '未设置')}") +else: + logger.warning("未检测到 LLM API Key 配置") +logger.info("===================") app = FastAPI(title="Life Echo API", version="1.0.0") + +@app.on_event("startup") +async def startup_event(): + """应用启动事件""" + logger.info("=" * 50) + logger.info("Life Echo API 正在启动...") + logger.info("=" * 50) + + +@app.on_event("shutdown") +async def shutdown_event(): + """应用关闭事件""" + logger.info("Life Echo API 正在关闭...") + + # CORS 配置 app.add_middleware( CORSMiddleware,