File size: 5,314 Bytes
d0dd276
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import logging
from datetime import datetime
from collections import deque
from threading import Lock

DEBUG = False  # 可以从环境变量中获取

LOG_FORMAT_DEBUG = '%(asctime)s - %(levelname)s - [%(key)s]-%(request_type)s-[%(model)s]-%(status_code)s: %(message)s - %(error_message)s'
LOG_FORMAT_NORMAL = '[%(asctime)s] [%(levelname)s] [%(key)s]-%(request_type)s-[%(model)s]-%(status_code)s: %(message)s'

# Vertex日志格式
VERTEX_LOG_FORMAT_DEBUG = '%(asctime)s - %(levelname)s - [%(vertex_id)s]-%(operation)s-[%(status)s]: %(message)s - %(error_message)s'
VERTEX_LOG_FORMAT_NORMAL = '[%(asctime)s] [%(levelname)s] [%(vertex_id)s]-%(operation)s-[%(status)s]: %(message)s'

# 配置 logger
logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)

# 控制台处理器
console_handler = logging.StreamHandler() 

# 设置日志格式
console_formatter = logging.Formatter('%(message)s')
console_handler.setFormatter(console_formatter) 
logger.addHandler(console_handler)

# 日志缓存,用于在网页上显示最近的日志
class LogManager:
    def __init__(self, max_logs=100):
        self.logs = deque(maxlen=max_logs)  # 使用双端队列存储最近的日志
        self.lock = Lock()
    
    def add_log(self, log_entry):
        with self.lock:
            self.logs.append(log_entry)
    
    def get_recent_logs(self, count=50):
        with self.lock:
            return list(self.logs)[-count:]

# 创建日志管理器实例 (输出到前端)
log_manager = LogManager()

# Vertex日志缓存,用于在网页上显示最近的Vertex日志
class VertexLogManager:
    def __init__(self, max_logs=100):
        self.logs = deque(maxlen=max_logs)  # 使用双端队列存储最近的Vertex日志
        self.lock = Lock()
    
    def add_log(self, log_entry):
        with self.lock:
            self.logs.append(log_entry)
    
    def get_recent_logs(self, count=50):
        with self.lock:
            return list(self.logs)[-count:]

# 创建Vertex日志管理器实例 (输出到前端)
vertex_log_manager = VertexLogManager()

def format_log_message(level, message, extra=None):
    extra = extra or {}
    log_values = {
        'asctime': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        'levelname': level,
        'key': extra.get('key', ''),
        'request_type': extra.get('request_type', ''),
        'model': extra.get('model', ''),
        'status_code': extra.get('status_code', ''),
        'error_message': extra.get('error_message', ''),
        'message': message
    }
    log_format = LOG_FORMAT_DEBUG if DEBUG else LOG_FORMAT_NORMAL
    formatted_log = log_format % log_values
    
    # 将格式化后的日志添加到日志管理器
    log_entry = {
        'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        'level': level,
        'key': extra.get('key', ''),
        'request_type': extra.get('request_type', ''),
        'model': extra.get('model', ''),
        'status_code': extra.get('status_code', ''),
        'message': message,
        'error_message': extra.get('error_message', ''),
        'formatted': formatted_log
    }
    log_manager.add_log(log_entry)
    
    return formatted_log

def vertex_format_log_message(level, message, extra=None):
    extra = extra or {}
    log_values = {
        'asctime': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        'levelname': level,
        'vertex_id': extra.get('vertex_id', ''),
        'operation': extra.get('operation', ''),
        'status': extra.get('status', ''),
        'error_message': extra.get('error_message', ''),
        'message': message
    }
    log_format = VERTEX_LOG_FORMAT_DEBUG if DEBUG else VERTEX_LOG_FORMAT_NORMAL
    formatted_log = log_format % log_values
    
    # 将格式化后的Vertex日志添加到Vertex日志管理器
    log_entry = {
        'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        'level': level,
        'vertex_id': extra.get('vertex_id', ''),
        'operation': extra.get('operation', ''),
        'status': extra.get('status', ''),
        'message': message,
        'error_message': extra.get('error_message', ''),
        'formatted': formatted_log
    }
    vertex_log_manager.add_log(log_entry)
    
    return formatted_log
    
    
def log(level: str, message: str, extra: dict = None, **kwargs):
    final_extra = {}
    
    if extra is not None and isinstance(extra, dict):
        final_extra.update(extra)
    
    # 将 kwargs 中的其他关键字参数合并进来,kwargs 会覆盖 extra 中的同名键
    final_extra.update(kwargs)
    
    # 调用 format_log_message,传递合并后的 final_extra 字典
    msg = format_log_message(level.upper(), message, extra=final_extra)
    
    getattr(logger, level.lower())(msg)

def vertex_log(level: str, message: str, extra: dict = None, **kwargs):
    final_extra = {}
    
    if extra is not None and isinstance(extra, dict):
        final_extra.update(extra)
    
    # 将 kwargs 中的其他关键字参数合并进来,kwargs 会覆盖 extra 中的同名键
    final_extra.update(kwargs)
    
    # 调用 vertex_format_log_message,传递合并后的 final_extra 字典
    msg = vertex_format_log_message(level.upper(), message, extra=final_extra)
    
    getattr(logger, level.lower())(msg)