diff --git a/video-gen-api/app/services/payment.py b/video-gen-api/app/services/payment.py index 5c08b81f..74732dc9 100644 --- a/video-gen-api/app/services/payment.py +++ b/video-gen-api/app/services/payment.py @@ -1,7 +1,6 @@ import logging import os from datetime import datetime, timedelta -from logging.handlers import TimedRotatingFileHandler from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession @@ -13,28 +12,53 @@ from app.services.credits import add_credits from app.utils.id_gen import generate_id, generate_order_no # --------------------------------------------------------------------------- -# Payment logger → log/payment/YYYY-MM-DD.log (one file per day, keep 30 days) +# Payment logger → log/payment/YYYY-MM-DD.log (one file per day, no cleanup) # --------------------------------------------------------------------------- +import time as _time + logger = logging.getLogger("payment") logger.setLevel(logging.INFO) _log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "log", "payment") os.makedirs(_log_dir, exist_ok=True) -_file_handler = TimedRotatingFileHandler( - os.path.join(_log_dir, "payment.log"), - when="midnight", - interval=1, - backupCount=0, - encoding="utf-8", - utc=False, -) -_file_handler.suffix = "%Y-%m-%d" -_file_handler.setFormatter(logging.Formatter( + +class DailyFileHandler(logging.FileHandler): + """Write to a file named by date, e.g. log/payment/2026-06-10.log""" + + def __init__(self, directory, encoding="utf-8"): + self._directory = directory + self._current_date = "" + self._file_handler = None + super().__init__(self._make_path(), mode="a", encoding=encoding, delay=False) + + def _make_path(self): + date_str = _time.strftime("%Y-%m-%d") + self._current_date = date_str + return os.path.join(self._directory, f"{date_str}.log") + + def emit(self, record): + date_str = _time.strftime("%Y-%m-%d") + if date_str != self._current_date: + # Day rolled over — switch to a new file + if self._file_handler: + self._file_handler.close() + self.baseFilename = self._make_path() + self._file_handler = logging.FileHandler( + self.baseFilename, mode="a", encoding=self.encoding + ) + self._file_handler.setFormatter(self.formatter) + self._current_date = date_str + self.stream = self._file_handler.stream + super().emit(record) + + +_handler = DailyFileHandler(_log_dir) +_handler.setFormatter(logging.Formatter( "[%(asctime)s] %(levelname)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S" )) if not logger.handlers: - logger.addHandler(_file_handler) + logger.addHandler(_handler) # Orders pending payment for longer than this are auto-cancelled ORDER_EXPIRE_MINUTES = 5