From 97058241ac339e9ab23223eb4b92cf1e17f40e91 Mon Sep 17 00:00:00 2001 From: mingjunzhao012665 Date: Sun, 18 Jan 2026 17:09:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD1=EF=BC=9A=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=90=AF=E5=8A=A8=E6=97=A5=E5=BF=97=E5=92=8C?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加日志配置,支持详细的启动日志记录 - 改进环境变量加载逻辑,支持从 .env 文件加载并记录加载的环境变量 - 添加敏感信息脱敏处理,保护 API Key 等敏感配置 - 添加应用启动和关闭事件处理 - 添加配置信息日志记录,方便调试和排查问题 --- api/main.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) 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,