Spaces:
Paused
Paused
| 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") | |