功能1:改进应用启动日志和环境变量加载

- 添加日志配置,支持详细的启动日志记录
- 改进环境变量加载逻辑,支持从 .env 文件加载并记录加载的环境变量
- 添加敏感信息脱敏处理,保护 API Key 等敏感配置
- 添加应用启动和关闭事件处理
- 添加配置信息日志记录,方便调试和排查问题
This commit is contained in:
mingjunzhao012665
2026-01-18 17:09:06 +08:00
parent 82f64da7d0
commit 97058241ac

View File

@@ -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,