Spaces:
Running
Running
import logging | |
import platform | |
import sys | |
from typing import Dict, Optional | |
# ANSI转义序列颜色代码 | |
COLORS = { | |
"DEBUG": "\033[34m", # 蓝色 | |
"INFO": "\033[32m", # 绿色 | |
"WARNING": "\033[33m", # 黄色 | |
"ERROR": "\033[31m", # 红色 | |
"CRITICAL": "\033[1;31m", # 红色加粗 | |
} | |
# Windows系统启用ANSI支持 | |
if platform.system() == "Windows": | |
import ctypes | |
kernel32 = ctypes.windll.kernel32 | |
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7) | |
class ColoredFormatter(logging.Formatter): | |
""" | |
自定义的日志格式化器,添加颜色支持 | |
""" | |
def format(self, record): | |
# 获取对应级别的颜色代码 | |
color = COLORS.get(record.levelname, "") | |
# 添加颜色代码和重置代码 | |
record.levelname = f"{color}{record.levelname}\033[0m" | |
# 创建包含文件名和行号的固定宽度字符串 | |
record.fileloc = f"[{record.filename}:{record.lineno}]" | |
return super().format(record) | |
# 日志格式 - 使用 fileloc 并设置固定宽度 (例如 30) | |
FORMATTER = ColoredFormatter( | |
"%(asctime)s | %(levelname)-17s | %(fileloc)-30s | %(message)s" | |
) | |
# 日志级别映射 | |
LOG_LEVELS = { | |
"debug": logging.DEBUG, | |
"info": logging.INFO, | |
"warning": logging.WARNING, | |
"error": logging.ERROR, | |
"critical": logging.CRITICAL, | |
} | |
class Logger: | |
def __init__(self): | |
pass | |
_loggers: Dict[str, logging.Logger] = {} | |
def setup_logger(name: str) -> logging.Logger: | |
""" | |
设置并获取logger | |
:param name: logger名称 | |
:return: logger实例 | |
""" | |
# 导入 settings 对象 | |
from app.config.config import settings | |
# 从全局配置获取日志级别 | |
log_level_str = settings.LOG_LEVEL.lower() | |
level = LOG_LEVELS.get(log_level_str, logging.INFO) | |
if name in Logger._loggers: | |
# 如果 logger 已存在,检查并更新其级别(如果需要) | |
existing_logger = Logger._loggers[name] | |
if existing_logger.level != level: | |
existing_logger.setLevel(level) | |
return existing_logger | |
logger = logging.getLogger(name) | |
logger.setLevel(level) | |
logger.propagate = False | |
# 添加控制台输出 | |
console_handler = logging.StreamHandler(sys.stdout) | |
console_handler.setFormatter(FORMATTER) | |
logger.addHandler(console_handler) | |
Logger._loggers[name] = logger | |
return logger | |
def get_logger(name: str) -> Optional[logging.Logger]: | |
""" | |
获取已存在的logger | |
:param name: logger名称 | |
:return: logger实例或None | |
""" | |
return Logger._loggers.get(name) | |
def update_log_levels(log_level: str): | |
""" | |
根据当前的全局配置更新所有已创建 logger 的日志级别。 | |
""" | |
log_level_str = log_level.lower() | |
new_level = LOG_LEVELS.get(log_level_str, logging.INFO) | |
updated_count = 0 | |
for logger_name, logger_instance in Logger._loggers.items(): | |
if logger_instance.level != new_level: | |
logger_instance.setLevel(new_level) | |
# 可选:记录级别变更日志,但注意避免在日志模块内部产生过多日志 | |
# print(f"Updated log level for logger '{logger_name}' to {log_level_str.upper()}") | |
updated_count += 1 | |
# 预定义的loggers | |
def get_openai_logger(): | |
return Logger.setup_logger("openai") | |
def get_gemini_logger(): | |
return Logger.setup_logger("gemini") | |
def get_chat_logger(): | |
return Logger.setup_logger("chat") | |
def get_model_logger(): | |
return Logger.setup_logger("model") | |
def get_security_logger(): | |
return Logger.setup_logger("security") | |
def get_key_manager_logger(): | |
return Logger.setup_logger("key_manager") | |
def get_main_logger(): | |
return Logger.setup_logger("main") | |
def get_embeddings_logger(): | |
return Logger.setup_logger("embeddings") | |
def get_request_logger(): | |
return Logger.setup_logger("request") | |
def get_retry_logger(): | |
return Logger.setup_logger("retry") | |
def get_image_create_logger(): | |
return Logger.setup_logger("image_create") | |
def get_exceptions_logger(): | |
return Logger.setup_logger("exceptions") | |
def get_application_logger(): | |
return Logger.setup_logger("application") | |
def get_initialization_logger(): | |
return Logger.setup_logger("initialization") | |
def get_middleware_logger(): | |
return Logger.setup_logger("middleware") | |
def get_routes_logger(): | |
return Logger.setup_logger("routes") | |
def get_config_routes_logger(): | |
return Logger.setup_logger("config_routes") | |
def get_config_logger(): | |
return Logger.setup_logger("config") | |
def get_database_logger(): | |
return Logger.setup_logger("database") | |
def get_log_routes_logger(): | |
return Logger.setup_logger("log_routes") | |
def get_stats_logger(): | |
return Logger.setup_logger("stats") | |
def get_update_logger(): | |
return Logger.setup_logger("update_service") | |
def get_scheduler_routes(): | |
return Logger.setup_logger("scheduler_routes") | |
def get_message_converter_logger(): | |
return Logger.setup_logger("message_converter") | |
def get_api_client_logger(): | |
return Logger.setup_logger("api_client") | |
def get_openai_compatible_logger(): | |
return Logger.setup_logger("openai_compatible") | |
def get_error_log_logger(): | |
return Logger.setup_logger("error_log") | |
def get_request_log_logger(): | |
return Logger.setup_logger("request_log") | |
def get_vertex_express_logger(): | |
return Logger.setup_logger("vertex_express") | |