From ae850de1281953723ce650cfe6b3811aa4296bd6 Mon Sep 17 00:00:00 2001 From: 18610128193 <10574456+chenweiqiang-123@user.noreply.gitee.com> Date: Fri, 26 Jun 2026 11:00:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=A5=E5=BF=97=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-api/app/services/upload_queue.py | 35 +------------ .../app/tasks/pre_test_result_task.py | 35 +------------ video-gen-api/app/tasks/token_refresh_task.py | 34 +------------ video-gen-api/app/utils/douyinRequest.py | 32 ++++++++++-- video-gen-api/app/utils/logger.py | 49 +++++++++++++++++++ 5 files changed, 82 insertions(+), 103 deletions(-) create mode 100644 video-gen-api/app/utils/logger.py diff --git a/video-gen-api/app/services/upload_queue.py b/video-gen-api/app/services/upload_queue.py index e5153ecc..73ce61f0 100644 --- a/video-gen-api/app/services/upload_queue.py +++ b/video-gen-api/app/services/upload_queue.py @@ -1,5 +1,4 @@ import asyncio -import logging from datetime import datetime, timezone from sqlalchemy import select, update @@ -15,42 +14,12 @@ from app.models.user_oauth_account import UserOAuthAccount from app.models.pre_test_template import PreTestTemplate from app.utils.id_gen import generate_id from app.utils.douyinApi import DouyinApi +from app.utils.logger import get_logger -import os import hashlib import json -LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "logs") - -os.makedirs(LOG_DIR, exist_ok=True) - -logger = logging.getLogger("upload_queue") -logger.setLevel(logging.INFO) - - -class DailyRotatingFileHandler(logging.FileHandler): - def __init__(self, directory, encoding=None): - self.directory = directory - filename = self._get_log_filename() - super().__init__(filename, encoding=encoding) - - def _get_log_filename(self): - return os.path.join(self.directory, f"upload_queue-{datetime.now(timezone.utc).strftime('%Y-%m-%d')}.log") - - def emit(self, record): - current_filename = self._get_log_filename() - if self.baseFilename != current_filename: - self.close() - self.baseFilename = current_filename - self.stream = self._open() - super().emit(record) - - -if not logger.handlers: - handler = DailyRotatingFileHandler(LOG_DIR, encoding="utf-8") - handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")) - logger.addHandler(handler) - +logger = get_logger("upload_queue", "upload_queue") douyin_api = DouyinApi() #上传素材队列,处理上传素材的任务 diff --git a/video-gen-api/app/tasks/pre_test_result_task.py b/video-gen-api/app/tasks/pre_test_result_task.py index 5dc25951..1c79d798 100644 --- a/video-gen-api/app/tasks/pre_test_result_task.py +++ b/video-gen-api/app/tasks/pre_test_result_task.py @@ -1,7 +1,5 @@ from datetime import datetime, timezone import asyncio -import os -import logging import json from sqlalchemy import select, update @@ -11,38 +9,9 @@ from app.models.base import async_session from app.models.resources_material import ResourcesMaterial from app.models.user_oauth import UserOAuth from app.utils.douyinApi import DouyinApi +from app.utils.logger import get_logger -LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "logs") -os.makedirs(LOG_DIR, exist_ok=True) - -#前测结果和上传素材属于一种任务,放到一起日志里边 -logger = logging.getLogger("upload_queue") -logger.setLevel(logging.INFO) - - -class DailyRotatingFileHandler(logging.FileHandler): - def __init__(self, directory, encoding=None): - self.directory = directory - filename = self._get_log_filename() - super().__init__(filename, encoding=encoding) - - def _get_log_filename(self): - return os.path.join(self.directory, f"pre_test_result_task-{datetime.now(timezone.utc).strftime('%Y-%m-%d')}.log") - - def emit(self, record): - current_filename = self._get_log_filename() - if self.baseFilename != current_filename: - self.close() - self.baseFilename = current_filename - self.stream = self._open() - super().emit(record) - - -if not logger.handlers: - handler = DailyRotatingFileHandler(LOG_DIR, encoding="utf-8") - handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")) - logger.addHandler(handler) - +logger = get_logger("pre_test_result_task", "pre_test_result_task") douyin_api = DouyinApi() #获取前测结果并更新数据库,计划任务,每2分钟执行一次 diff --git a/video-gen-api/app/tasks/token_refresh_task.py b/video-gen-api/app/tasks/token_refresh_task.py index 3ea9d4fe..effe9e54 100644 --- a/video-gen-api/app/tasks/token_refresh_task.py +++ b/video-gen-api/app/tasks/token_refresh_task.py @@ -2,9 +2,6 @@ from datetime import datetime, timedelta, timezone import asyncio import httpx import json -import os -import logging -from logging.handlers import TimedRotatingFileHandler from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession @@ -14,37 +11,10 @@ from app.models.user_oauth_app import UserOAuthApp from app.models.base import async_session from app.config import settings from app.utils.redis import get_redis +from app.utils.logger import get_logger REDIS_KEY = "douyin:tokens" - -LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "logs") - -os.makedirs(LOG_DIR, exist_ok=True) - -logger = logging.getLogger("token_refresh") -logger.setLevel(logging.INFO) - -def get_log_filename(): - return os.path.join(LOG_DIR, f"token_refresh-{datetime.now().strftime('%Y-%m-%d')}.log") - -class DailyRotatingFileHandler(logging.FileHandler): - def __init__(self, directory, encoding=None): - self.directory = directory - filename = get_log_filename() - super().__init__(filename, encoding=encoding) - - def emit(self, record): - current_filename = get_log_filename() - if self.baseFilename != current_filename: - self.close() - self.baseFilename = current_filename - self.stream = self._open() - super().emit(record) - -handler = DailyRotatingFileHandler(LOG_DIR, encoding="utf-8") -handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")) - -logger.addHandler(handler) +logger = get_logger("token_refresh", "token_refresh") diff --git a/video-gen-api/app/utils/douyinRequest.py b/video-gen-api/app/utils/douyinRequest.py index 5136ffca..6ebf0b5b 100644 --- a/video-gen-api/app/utils/douyinRequest.py +++ b/video-gen-api/app/utils/douyinRequest.py @@ -11,6 +11,9 @@ from app.models.user_oauth import UserOAuth from app.models.user_oauth_app import UserOAuthApp from app.models.base import async_session from app.utils.redis import get_redis +from app.utils.logger import get_logger + +logger = get_logger("douyin_request", "douyin_request") class DouyinRequest: @@ -244,8 +247,6 @@ class DouyinRequest: await asyncio.sleep(i * 10) continue - res = json.dumps(data) if 'data' in locals() else '' - options_log = {} if options: for key, value in options.items(): @@ -254,10 +255,31 @@ class DouyinRequest: else: options_log[key] = value - raise RuntimeError( - f'DouYin API request failed after 5 retries. ' - f'url:{url};oauthId:{oauth_id};options:{json.dumps(options_log)};response:{res}' + res = json.dumps(data) if 'data' in locals() else '' + + logger.error( + f'DouYin API request failed after {request_count} retries. ' + f'url:{url};method:{method};oauth_id:{oauth_id};options:{json.dumps(options_log)};response:{res}' ) + + if 'data' in locals() and data.get('code', 0) != 0: + raise ValueError(f'接口返回错误[code:{data.get("code", "接口编码")}]{data.get("message", "接口返回错误")}') + else: + raise ValueError('网络错误,稍后重试。') + + # options_log = {} + # if options: + # for key, value in options.items(): + # if key == 'files': + # options_log[key] = {k: (v[0], 'bytes_content', v[2]) for k, v in value.items()} + # else: + # options_log[key] = value + # raise RuntimeError( + # f'DouYin API request failed after 5 retries. ' + # f'url:{url};oauthId:{oauth_id};options:{json.dumps(options_log)};response:{res}' + # ) + # if code != 0: + # raise ValueError(f'response:{res}') # 无token请求 async def request_with_context( diff --git a/video-gen-api/app/utils/logger.py b/video-gen-api/app/utils/logger.py new file mode 100644 index 00000000..27ae41b5 --- /dev/null +++ b/video-gen-api/app/utils/logger.py @@ -0,0 +1,49 @@ +import os +import logging +from datetime import datetime + + +def get_logger(name: str, log_filename: str) -> logging.Logger: + """ + 创建并配置一个每日滚动的日志记录器 + + Args: + name: 日志记录器名称 + log_filename: 日志文件名(不含日期和扩展名) + + Returns: + 配置好的日志记录器对象 + """ + logger = logging.getLogger(name) + logger.setLevel(logging.INFO) + + if logger.handlers: + return logger + + LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "logs") + os.makedirs(LOG_DIR, exist_ok=True) + + class DailyRotatingFileHandler(logging.FileHandler): + def __init__(self, directory, filename_prefix, encoding=None): + self.directory = directory + self.filename_prefix = filename_prefix + filename = self._get_log_filename() + super().__init__(filename, encoding=encoding) + + def _get_log_filename(self): + return os.path.join(self.directory, f"{self.filename_prefix}-{datetime.now().strftime('%Y-%m-%d')}.log") + + def emit(self, record): + current_filename = self._get_log_filename() + if self.baseFilename != current_filename: + self.close() + self.baseFilename = current_filename + self.stream = self._open() + super().emit(record) + + handler = DailyRotatingFileHandler(LOG_DIR, log_filename, encoding="utf-8") + handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")) + + logger.addHandler(handler) + + return logger