diff --git a/main.py b/main.py index 6b7c0af..14d6467 100644 --- a/main.py +++ b/main.py @@ -26,6 +26,9 @@ import py_linq import time_api import simulation import globals +import os +import logging +from logging.handlers import TimedRotatingFileHandler JUNCTION = 0 RESERVOIR = 1 @@ -79,13 +82,44 @@ redis_client = redis.Redis(host="localhost", port=6379, db=0) # influx_org_name = influxdb_info.org # influx_client = InfluxDBClient(url=influx_url, token=influx_token, org=influx_org_name, timeout=100*1000) # 100 seconds -# 配置日志记录器 -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__) +def setup_logger(): + # 创建日志目录 + log_dir = "logs" + os.makedirs(log_dir, exist_ok=True) + + # 配置基础日志格式 + log_format = "%(asctime)s - %(levelname)s - %(message)s" + formatter = logging.Formatter(log_format) + + # 创建主 Logger + logger = logging.getLogger() + logger.setLevel(logging.DEBUG) # 全局日志级别 + + # --- 1. 按日期分割的日志文件 Handler --- + log_file = os.path.join(log_dir, "fastapi.log") + file_handler = TimedRotatingFileHandler( + filename=log_file, + when="midnight", # 每天午夜轮转 + interval=1, + backupCount=7, + encoding="utf-8" + ) + file_handler.suffix = "fastapi-%Y-%m-%d.log" # 文件名格式 + file_handler.setFormatter(formatter) + file_handler.setLevel(logging.DEBUG) # 文件记录所有级别日志 + + # --- 2. 控制台实时输出 Handler --- + console_handler = logging.StreamHandler() # 默认输出到 sys.stderr (控制台) + console_handler.setFormatter(formatter) + console_handler.setLevel(logging.INFO) # 控制台仅显示 INFO 及以上级别 + + # 将 Handler 添加到 Logger + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + return logger + +logger = setup_logger() # 配置 CORS 中间件 app.add_middleware( @@ -125,16 +159,16 @@ async def log_requests(request: Request, call_next): is_file_upload = request.headers.get("content-type", "").startswith("multipart/form-data") # 记录接收的请求数据 - logging.info(f"Received request: {request.method} {request.url} at {request_time_str}") + logger.info(f"Received request: {request.method} {request.url} at {request_time_str}") if not is_file_upload: request_body = await request.body() - logging.info(f"Request body: {request_body.decode('utf-8')}") + logger.info(f"Request body: {request_body.decode('utf-8')}") # 创建新的 Request 对象,传递缓存的请求体 receive = await receive_with_body(request_body) request = Request(request.scope, receive=receive) else: - logging.info(f"Request body: File") + logger.info(f"Request body: File") # 处理请求 response = await call_next(request) @@ -151,9 +185,9 @@ async def log_requests(request: Request, call_next): # 记录响应的状态码以及是否成功 success_status = response.status_code < 400 - logging.info(f"Response status: {response.status_code} at {response_time_str}, success: {success_status}") + logger.info(f"Response status: {response.status_code} at {response_time_str}, success: {success_status}") # logging.info(f"Response body: {response_body.decode('utf-8')}") - logging.info(f"Processing time: {processing_time:.3f} seconds") + logger.info(f"Processing time: {processing_time:.3f} seconds") return response