File size: 8,219 Bytes
82bf89e |
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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
import logging
import os
from datetime import datetime
from typing import Optional, Dict, Any, List
import json
class ChatLogger:
"""
聊天应用的关键日志记录器
"""
def __init__(self, log_dir: str = "logs"):
self.log_dir = log_dir
self._ensure_log_dir()
self._setup_loggers()
def _ensure_log_dir(self):
"""确保日志目录存在"""
if not os.path.exists(self.log_dir):
os.makedirs(self.log_dir)
def _setup_loggers(self):
"""设置不同类型的日志记录器"""
# 用户行为日志
self.user_logger = logging.getLogger('user_actions')
self.user_logger.setLevel(logging.INFO)
# 防止重复日志
self.user_logger.handlers.clear()
user_handler = logging.FileHandler(
os.path.join(self.log_dir, 'user_actions.log'),
encoding='utf-8'
)
user_formatter = logging.Formatter(
'📝 %(asctime)s - %(levelname)s - %(message)s'
)
user_handler.setFormatter(user_formatter)
self.user_logger.addHandler(user_handler)
# 添加控制台输出
console_handler = logging.StreamHandler()
console_handler.setFormatter(user_formatter)
self.user_logger.addHandler(console_handler)
# MCP服务日志
self.mcp_logger = logging.getLogger('mcp_services')
self.mcp_logger.setLevel(logging.INFO)
# 防止重复日志
self.mcp_logger.handlers.clear()
mcp_handler = logging.FileHandler(
os.path.join(self.log_dir, 'mcp_services.log'),
encoding='utf-8'
)
mcp_formatter = logging.Formatter(
'🔧 %(asctime)s - %(levelname)s - %(message)s'
)
mcp_handler.setFormatter(mcp_formatter)
self.mcp_logger.addHandler(mcp_handler)
# 添加控制台输出
mcp_console_handler = logging.StreamHandler()
mcp_console_handler.setFormatter(mcp_formatter)
self.mcp_logger.addHandler(mcp_console_handler)
# 系统状态日志
self.system_logger = logging.getLogger('system_status')
self.system_logger.setLevel(logging.INFO)
# 防止重复日志
self.system_logger.handlers.clear()
system_handler = logging.FileHandler(
os.path.join(self.log_dir, 'system_status.log'),
encoding='utf-8'
)
system_formatter = logging.Formatter(
'🏥 %(asctime)s - %(levelname)s - %(message)s'
)
system_handler.setFormatter(system_formatter)
self.system_logger.addHandler(system_handler)
# 添加控制台输出
system_console_handler = logging.StreamHandler()
system_console_handler.setFormatter(system_formatter)
self.system_logger.addHandler(system_console_handler)
# 错误日志
self.error_logger = logging.getLogger('errors')
self.error_logger.setLevel(logging.ERROR)
# 防止重复日志
self.error_logger.handlers.clear()
error_handler = logging.FileHandler(
os.path.join(self.log_dir, 'errors.log'),
encoding='utf-8'
)
error_formatter = logging.Formatter(
'❌ %(asctime)s - %(levelname)s - %(message)s'
)
error_handler.setFormatter(error_formatter)
self.error_logger.addHandler(error_handler)
# 添加控制台输出
error_console_handler = logging.StreamHandler()
error_console_handler.setFormatter(error_formatter)
self.error_logger.addHandler(error_console_handler)
def log_user_action(self, action: str, details: Optional[Dict[str, Any]] = None):
"""记录用户行为"""
message = f"USER_ACTION: {action}"
if details:
message += f" - Details: {json.dumps(details, ensure_ascii=False)}"
self.user_logger.info(message)
def log_mcp_connection(self, server_name: str, server_url: str, success: bool, error: Optional[str] = None):
"""记录MCP服务器连接"""
status = "SUCCESS" if success else "FAILED"
message = f"MCP_CONNECTION: {server_name} ({server_url}) - {status}"
if error:
message += f" - Error: {error}"
self.mcp_logger.info(message)
def log_mcp_tool_call(self, tool_name: str, input_data: Dict[str, Any], chat_id: Optional[str] = None):
"""记录MCP工具调用"""
message = f"MCP_TOOL_CALL: {tool_name}"
if chat_id:
message += f" - ChatID: {chat_id}"
message += f" - Input: {json.dumps(input_data, ensure_ascii=False)}"
self.mcp_logger.info(message)
def log_mcp_tool_response(self, tool_name: str, response_data: Any, chat_id: Optional[str] = None):
"""记录MCP工具响应"""
message = f"MCP_TOOL_RESPONSE: {tool_name}"
if chat_id:
message += f" - ChatID: {chat_id}"
# 对于大型响应,只记录摘要
if isinstance(response_data, str) and len(response_data) > 1000:
message += f" - Response: {response_data[:500]}... (truncated, total length: {len(response_data)})"
else:
message += f" - Response: {json.dumps(response_data, ensure_ascii=False)}"
self.mcp_logger.info(message)
def log_mcp_agent_usage(self, agent_type: str, tools_used: List[str], chat_id: Optional[str] = None):
"""记录MCP代理使用情况"""
if agent_type == "ReactAgent":
message = f"MCP_AGENT_AVAILABLE: {agent_type}"
if chat_id:
message += f" - ChatID: {chat_id}"
message += f" - Available Tools: {', '.join(tools_used)}"
else:
message = f"MCP_AGENT_USAGE: {agent_type}"
if chat_id:
message += f" - ChatID: {chat_id}"
message += f" - Tools Used: {', '.join(tools_used)}"
self.mcp_logger.info(message)
def log_chat_message(self, role: str, content: str, chat_id: Optional[str] = None, has_tool: bool = False):
"""记录聊天消息"""
message = f"CHAT_MESSAGE: {role.upper()}"
if chat_id:
message += f" - ChatID: {chat_id}"
if has_tool:
message += " - HasTool: True"
# 对于长消息,只记录摘要
if len(content) > 500:
message += f" - Content: {content[:200]}... (truncated, total length: {len(content)})"
else:
message += f" - Content: {content}"
self.user_logger.info(message)
def log_llm_test(self, provider: str, success: bool, error: Optional[str] = None):
"""记录LLM连接测试"""
status = "SUCCESS" if success else "FAILED"
message = f"LLM_TEST: {provider} - {status}"
if error:
message += f" - Error: {error}"
self.system_logger.info(message)
def log_system_status(self, status: str, details: Optional[Dict[str, Any]] = None):
"""记录系统状态"""
message = f"SYSTEM_STATUS: {status}"
if details:
message += f" - Details: {json.dumps(details, ensure_ascii=False)}"
self.system_logger.info(message)
def log_error(self, error_type: str, error_message: str, context: Optional[Dict[str, Any]] = None):
"""记录错误"""
message = f"ERROR: {error_type} - {error_message}"
if context:
message += f" - Context: {json.dumps(context, ensure_ascii=False)}"
self.error_logger.error(message)
def log_long_running_task(self, task_name: str, duration_seconds: float, chat_id: Optional[str] = None):
"""记录长时间运行的任务"""
message = f"LONG_RUNNING_TASK: {task_name} - Duration: {duration_seconds:.2f}s"
if chat_id:
message += f" - ChatID: {chat_id}"
self.system_logger.info(message)
# 全局日志记录器实例
chat_logger = ChatLogger()
def get_logger():
"""获取全局日志记录器"""
return chat_logger |