File size: 3,763 Bytes
df4585d
 
 
 
129e5fa
df4585d
 
 
 
 
 
 
 
3ee700d
 
 
 
df4585d
3ee700d
df4585d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# src/core/logger.py
import sys
import inspect
import os
import time
from loguru import logger

class Logger:
    def __init__(self, level="INFO", colorize=True, format=None, max_logs=100):
        """
        初始化 Logger 实例。

        Args:
            level (str): 日志级别.
            colorize (bool): 是否彩色输出.
            format (str): 日志格式.
            max_logs (int): 存储的最大日志条数.
        """
        self.level = level # 存储日志级别
        logger.remove()
        if format is None:
            format = (
                "{time:YYYY-MM-DD HH:mm:ss} | "
                "{level: <8} | "
                "{extra[filename]}:{extra[function]}:{extra[lineno]} | "
                "{message}"
            )
        logger.add(
            sys.stderr,
            level=level,
            format=format,
            colorize=colorize,
            backtrace=True,
            diagnose=True
        )
        self.logger = logger
        self._log_history = [] # 存储日志历史
        self._max_logs = max_logs # 最大日志条数

    def _add_log_to_history(self, message, level, source):
        """将日志添加到历史记录"""
        timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        log_entry = f"{timestamp} | {level.upper(): <8} | [{source}] {message}"
        self._log_history.append(log_entry)
        # 保持日志历史在最大条数内
        if len(self._log_history) > self._max_logs:
            self._log_history = self._log_history[-self._max_logs:]

    def get_recent_logs(self):
        """获取最近的日志历史"""
        return "\n".join(self._log_history)

    def _get_caller_info(self):
        frame = inspect.currentframe()
        try:
            caller_frame = frame.f_back.f_back
            full_path = caller_frame.f_code.co_filename
            function = caller_frame.f_code.co_name
            lineno = caller_frame.f_lineno
            filename = os.path.basename(full_path)
            return {
                'filename': filename,
                'function': function,
                'lineno': lineno
            }
        finally:
            del frame

    def info(self, message, source="API"):
        caller_info = self._get_caller_info()
        log_message = f"[{source}] {message}"
        self.logger.bind(**caller_info).info(log_message)
        self._add_log_to_history(message, "INFO", source)

    def error(self, message, source="API"):
        caller_info = self._get_caller_info()
        if isinstance(message, Exception):
            log_message = f"[{source}] {str(message)}"
            self.logger.bind(**caller_info).exception(log_message)
        else:
            log_message = f"[{source}] {message}"
            self.logger.bind(**caller_info).error(log_message)
        self._add_log_to_history(message, "ERROR", source)


    def warning(self, message, source="API"):
        caller_info = self._get_caller_info()
        log_message = f"[{source}] {message}"
        self.logger.bind(**caller_info).warning(log_message)
        self._add_log_to_history(message, "WARNING", source)

    def debug(self, message, source="API"):
        caller_info = self._get_caller_info()
        log_message = f"[{source}] {message}"
        self.logger.bind(**caller_info).debug(log_message)
        self._add_log_to_history(message, "DEBUG", source)


    async def request_logger(self, request):
        caller_info = self._get_caller_info()
        log_message = f"请求: {request.method} {request.path}"
        self.logger.bind(**caller_info).info(log_message, "Request")
        self._add_log_to_history(log_message, "INFO", "Request")


# 初始化全局 logger 实例
logger = Logger(level="INFO")