Spaces:
Paused
Paused
| import json | |
| import logging | |
| import os | |
| import sys | |
| from datetime import datetime | |
| from logging import Formatter | |
| set_verbose = False | |
| if set_verbose is True: | |
| logging.warning( | |
| "`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs." | |
| ) | |
| json_logs = bool(os.getenv("JSON_LOGS", False)) | |
| # Create a handler for the logger (you may need to adapt this based on your needs) | |
| log_level = os.getenv("LITELLM_LOG", "DEBUG") | |
| numeric_level: str = getattr(logging, log_level.upper()) | |
| handler = logging.StreamHandler() | |
| handler.setLevel(numeric_level) | |
| class JsonFormatter(Formatter): | |
| def __init__(self): | |
| super(JsonFormatter, self).__init__() | |
| def formatTime(self, record, datefmt=None): | |
| # Use datetime to format the timestamp in ISO 8601 format | |
| dt = datetime.fromtimestamp(record.created) | |
| return dt.isoformat() | |
| def format(self, record): | |
| json_record = { | |
| "message": record.getMessage(), | |
| "level": record.levelname, | |
| "timestamp": self.formatTime(record), | |
| } | |
| if record.exc_info: | |
| json_record["stacktrace"] = self.formatException(record.exc_info) | |
| return json.dumps(json_record) | |
| # Function to set up exception handlers for JSON logging | |
| def _setup_json_exception_handlers(formatter): | |
| # Create a handler with JSON formatting for exceptions | |
| error_handler = logging.StreamHandler() | |
| error_handler.setFormatter(formatter) | |
| # Setup excepthook for uncaught exceptions | |
| def json_excepthook(exc_type, exc_value, exc_traceback): | |
| record = logging.LogRecord( | |
| name="LiteLLM", | |
| level=logging.ERROR, | |
| pathname="", | |
| lineno=0, | |
| msg=str(exc_value), | |
| args=(), | |
| exc_info=(exc_type, exc_value, exc_traceback), | |
| ) | |
| error_handler.handle(record) | |
| sys.excepthook = json_excepthook | |
| # Configure asyncio exception handler if possible | |
| try: | |
| import asyncio | |
| def async_json_exception_handler(loop, context): | |
| exception = context.get("exception") | |
| if exception: | |
| record = logging.LogRecord( | |
| name="LiteLLM", | |
| level=logging.ERROR, | |
| pathname="", | |
| lineno=0, | |
| msg=str(exception), | |
| args=(), | |
| exc_info=None, | |
| ) | |
| error_handler.handle(record) | |
| else: | |
| loop.default_exception_handler(context) | |
| asyncio.get_event_loop().set_exception_handler(async_json_exception_handler) | |
| except Exception: | |
| pass | |
| # Create a formatter and set it for the handler | |
| if json_logs: | |
| handler.setFormatter(JsonFormatter()) | |
| _setup_json_exception_handlers(JsonFormatter()) | |
| else: | |
| formatter = logging.Formatter( | |
| "\033[92m%(asctime)s - %(name)s:%(levelname)s\033[0m: %(filename)s:%(lineno)s - %(message)s", | |
| datefmt="%H:%M:%S", | |
| ) | |
| handler.setFormatter(formatter) | |
| verbose_proxy_logger = logging.getLogger("LiteLLM Proxy") | |
| verbose_router_logger = logging.getLogger("LiteLLM Router") | |
| verbose_logger = logging.getLogger("LiteLLM") | |
| # Add the handler to the logger | |
| verbose_router_logger.addHandler(handler) | |
| verbose_proxy_logger.addHandler(handler) | |
| verbose_logger.addHandler(handler) | |
| def _turn_on_json(): | |
| handler = logging.StreamHandler() | |
| handler.setFormatter(JsonFormatter()) | |
| # Define all loggers to update, including root logger | |
| loggers = [logging.getLogger()] + [ | |
| verbose_router_logger, | |
| verbose_proxy_logger, | |
| verbose_logger, | |
| ] | |
| # Iterate through each logger and update its handlers | |
| for logger in loggers: | |
| # Remove all existing handlers | |
| for h in logger.handlers[:]: | |
| logger.removeHandler(h) | |
| # Add the new handler | |
| logger.addHandler(handler) | |
| # Set up exception handlers | |
| _setup_json_exception_handlers(JsonFormatter()) | |
| def _turn_on_debug(): | |
| verbose_logger.setLevel(level=logging.DEBUG) # set package log to debug | |
| verbose_router_logger.setLevel(level=logging.DEBUG) # set router logs to debug | |
| verbose_proxy_logger.setLevel(level=logging.DEBUG) # set proxy logs to debug | |
| def _disable_debugging(): | |
| verbose_logger.disabled = True | |
| verbose_router_logger.disabled = True | |
| verbose_proxy_logger.disabled = True | |
| def _enable_debugging(): | |
| verbose_logger.disabled = False | |
| verbose_router_logger.disabled = False | |
| verbose_proxy_logger.disabled = False | |
| def print_verbose(print_statement): | |
| try: | |
| if set_verbose: | |
| print(print_statement) # noqa | |
| except Exception: | |
| pass | |
| def _is_debugging_on() -> bool: | |
| """ | |
| Returns True if debugging is on | |
| """ | |
| if verbose_logger.isEnabledFor(logging.DEBUG) or set_verbose is True: | |
| return True | |
| return False | |