Appointment.utils.log 源代码

import logging
from datetime import datetime, timedelta

from django.db.models import QuerySet

from Appointment.models import (
    User,
    Participant,
    Room,
    Appoint,
    LongTermAppoint,
    CardCheckInfo,
)
from Appointment.apps import AppointmentConfig as AppConfig
from boot.config import GLOBAL_CONFIG
from record.log.logger import Logger
from utils.inspect import find_caller


__all__ = [
    "write_before_delete",
    "logger",
    "get_user_logger",
]





class AppointRecordLogger(Logger):
    def add_default_handler(self, name: str, *paths: str) -> None:
        return super().add_default_handler(
            name, 'appoint_record', *paths, format='%(message)s')


[文档] def write_before_delete(appoint_list: QuerySet[Appoint]): """每周定时删除预约的程序,用于减少系统内的预约数量""" date = str(datetime.now().date()) logger = AppointRecordLogger.getLogger(date) period_start = (datetime.now() - timedelta(days=7)).date() logger.info(f"{period_start}~{date}") for appoint in appoint_list.exclude(Astatus=Appoint.Status.CANCELED): logger.info(appoint.toJson()) logger.info("end of file")
class AppointmentLogger(Logger): def _log(self, level, msg, args, exc_info = None, extra = None, stack_info = False, stacklevel = 1) -> None: stacklevel = stacklevel + 1 # TODO: 调用栈对包装器无法提供信息,使用类方法后重启本功能 file, caller, lineno = find_caller(stacklevel) file = file.removeprefix('Appointment.') source = f'{file}.{caller}' msg = str(msg) log_msg = source.ljust(40) + msg log_msg = msg super()._log(level, log_msg, args, exc_info, extra, stack_info, stacklevel) if level >= logging.ERROR: self._send_wechat(f'错误位置:{source} {lineno}\n' + msg, level) def _send_wechat(self, message: str, level: int = logging.ERROR): if not GLOBAL_CONFIG.debug_stuids: return from extern.wechat import send_wechat send_wechat( GLOBAL_CONFIG.debug_stuids, '地下室发生错误', message, url=f'/logs/?file={self.name}.log', ) class UserLogger(AppointmentLogger): def add_default_handler(self, name: str, *paths: str) -> None: return super().add_default_handler(name, 'user_detail', *paths) logger = AppointmentLogger.getLogger(AppConfig.name)
[文档] def get_user_logger(source: User | Participant | Appoint | LongTermAppoint | str): '''获取用户日志记录器''' match source: case User(): name = source.get_username() case Participant(): name = source.get_id() case Appoint(): name = source.get_major_id() case LongTermAppoint(): name = source.get_applicant_id() case str(): name = source case _: name = 'unknown' return UserLogger.getLogger(name)