|
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)) |
|
|
|
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): |
|
|
|
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) |
|
|
|
|
|
|
|
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") |
|
|
|
|
|
verbose_router_logger.addHandler(handler) |
|
verbose_proxy_logger.addHandler(handler) |
|
verbose_logger.addHandler(handler) |
|
|
|
|
|
def _turn_on_json(): |
|
handler = logging.StreamHandler() |
|
handler.setFormatter(JsonFormatter()) |
|
|
|
|
|
loggers = [verbose_router_logger, verbose_proxy_logger, verbose_logger] |
|
|
|
|
|
for logger in loggers: |
|
|
|
for h in logger.handlers[:]: |
|
logger.removeHandler(h) |
|
|
|
|
|
logger.addHandler(handler) |
|
|
|
|
|
def _turn_on_debug(): |
|
verbose_logger.setLevel(level=logging.DEBUG) |
|
verbose_router_logger.setLevel(level=logging.DEBUG) |
|
verbose_proxy_logger.setLevel(level=logging.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) |
|
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 |
|
|