|
|
@@ -4,6 +4,8 @@ auther: tanlie
|
|
|
date: 2026/8/30
|
|
|
"""
|
|
|
import logging
|
|
|
+import os
|
|
|
+from logging.handlers import RotatingFileHandler
|
|
|
import traceback
|
|
|
from fastapi import FastAPI, Request, HTTPException
|
|
|
from fastapi.exceptions import RequestValidationError
|
|
|
@@ -12,9 +14,30 @@ from fastapi.responses import JSONResponse
|
|
|
from app.mobile import register_mobile_routes
|
|
|
from app.core.response import error_response
|
|
|
|
|
|
-# Basic logging configuration for the app; applications may override this
|
|
|
-logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s")
|
|
|
+# Configure logging: write to logs/app.log (rotating) and also to console. Avoid duplicate handlers.
|
|
|
logger = logging.getLogger("app")
|
|
|
+if not logger.handlers:
|
|
|
+ # Determine logs directory relative to this file (project-root/app/../logs)
|
|
|
+ base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
|
|
+ log_dir = os.path.join(base_dir, "logs")
|
|
|
+ os.makedirs(log_dir, exist_ok=True)
|
|
|
+ log_file = os.path.join(log_dir, "app.log")
|
|
|
+
|
|
|
+ formatter = logging.Formatter("%(asctime)s %(levelname)s %(name)s: %(message)s")
|
|
|
+
|
|
|
+ # Rotating file handler
|
|
|
+ file_handler = RotatingFileHandler(log_file, maxBytes=10 * 1024 * 1024, backupCount=7, encoding="utf-8")
|
|
|
+ file_handler.setFormatter(formatter)
|
|
|
+ file_handler.setLevel(logging.INFO)
|
|
|
+ logger.addHandler(file_handler)
|
|
|
+
|
|
|
+ # Console handler
|
|
|
+ console_handler = logging.StreamHandler()
|
|
|
+ console_handler.setFormatter(formatter)
|
|
|
+ console_handler.setLevel(logging.INFO)
|
|
|
+ logger.addHandler(console_handler)
|
|
|
+
|
|
|
+ logger.setLevel(logging.INFO)
|
|
|
|
|
|
|
|
|
def create_app():
|