import json import logging import os 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) # Create a formatter and set it for the handler if json_logs: handler.setFormatter(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 a list of the loggers to update loggers = [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) 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