This commit is contained in:
2026-06-10 15:18:14 +08:00
+38 -14
View File
@@ -1,7 +1,6 @@
import logging import logging
import os import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
from logging.handlers import TimedRotatingFileHandler
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession 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 from app.utils.id_gen import generate_id, generate_order_no
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Payment logger → logs/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 = logging.getLogger("payment")
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
_log_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "log", "payment") _log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "log", "payment")
os.makedirs(_log_dir, exist_ok=True) os.makedirs(_log_dir, exist_ok=True)
_file_handler = TimedRotatingFileHandler(
os.path.join(_log_dir, "payment.log"), class DailyFileHandler(logging.FileHandler):
when="midnight", """Write to a file named by date, e.g. log/payment/2026-06-10.log"""
interval=1,
backupCount=0, def __init__(self, directory, encoding="utf-8"):
encoding="utf-8", self._directory = directory
utc=False, self._current_date = ""
) self._file_handler = None
_file_handler.suffix = "%Y-%m-%d" super().__init__(self._make_path(), mode="a", encoding=encoding, delay=False)
_file_handler.setFormatter(logging.Formatter(
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" "[%(asctime)s] %(levelname)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)) ))
if not logger.handlers: if not logger.handlers:
logger.addHandler(_file_handler) logger.addHandler(_handler)
# Orders pending payment for longer than this are auto-cancelled # Orders pending payment for longer than this are auto-cancelled
ORDER_EXPIRE_MINUTES = 5 ORDER_EXPIRE_MINUTES = 5