mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 02:34:29 +00:00
* fix(logging): add json formatting for uncaught exceptions (#9615) * fix(_logging.py): cleanup logging to catch unhandled exceptions * fix(_logging.py): avoid using 'print' ' --------- Co-authored-by: Henrique Cavarsan <hcavarsan@yahoo.com.br>
This commit is contained in:
parent
205db622bf
commit
1a441def03
2 changed files with 58 additions and 3 deletions
|
@ -1,6 +1,7 @@
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from logging import Formatter
|
from logging import Formatter
|
||||||
|
|
||||||
|
@ -40,9 +41,56 @@ class JsonFormatter(Formatter):
|
||||||
return json.dumps(json_record)
|
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
|
# Create a formatter and set it for the handler
|
||||||
if json_logs:
|
if json_logs:
|
||||||
handler.setFormatter(JsonFormatter())
|
handler.setFormatter(JsonFormatter())
|
||||||
|
_setup_json_exception_handlers(JsonFormatter())
|
||||||
else:
|
else:
|
||||||
formatter = logging.Formatter(
|
formatter = logging.Formatter(
|
||||||
"\033[92m%(asctime)s - %(name)s:%(levelname)s\033[0m: %(filename)s:%(lineno)s - %(message)s",
|
"\033[92m%(asctime)s - %(name)s:%(levelname)s\033[0m: %(filename)s:%(lineno)s - %(message)s",
|
||||||
|
@ -65,18 +113,24 @@ def _turn_on_json():
|
||||||
handler = logging.StreamHandler()
|
handler = logging.StreamHandler()
|
||||||
handler.setFormatter(JsonFormatter())
|
handler.setFormatter(JsonFormatter())
|
||||||
|
|
||||||
# Define a list of the loggers to update
|
# Define all loggers to update, including root logger
|
||||||
loggers = [verbose_router_logger, verbose_proxy_logger, verbose_logger]
|
loggers = [logging.getLogger()] + [
|
||||||
|
verbose_router_logger,
|
||||||
|
verbose_proxy_logger,
|
||||||
|
verbose_logger,
|
||||||
|
]
|
||||||
|
|
||||||
# Iterate through each logger and update its handlers
|
# Iterate through each logger and update its handlers
|
||||||
for logger in loggers:
|
for logger in loggers:
|
||||||
# Remove all existing handlers
|
# Remove all existing handlers
|
||||||
for h in logger.handlers[:]:
|
for h in logger.handlers[:]:
|
||||||
logger.removeHandler(h)
|
logger.removeHandler(h)
|
||||||
|
|
||||||
# Add the new handler
|
# Add the new handler
|
||||||
logger.addHandler(handler)
|
logger.addHandler(handler)
|
||||||
|
|
||||||
|
# Set up exception handlers
|
||||||
|
_setup_json_exception_handlers(JsonFormatter())
|
||||||
|
|
||||||
|
|
||||||
def _turn_on_debug():
|
def _turn_on_debug():
|
||||||
verbose_logger.setLevel(level=logging.DEBUG) # set package log to debug
|
verbose_logger.setLevel(level=logging.DEBUG) # set package log to debug
|
||||||
|
|
|
@ -20,6 +20,7 @@ model_list:
|
||||||
litellm_settings:
|
litellm_settings:
|
||||||
num_retries: 0
|
num_retries: 0
|
||||||
callbacks: ["prometheus"]
|
callbacks: ["prometheus"]
|
||||||
|
json_logs: true
|
||||||
|
|
||||||
router_settings:
|
router_settings:
|
||||||
routing_strategy: usage-based-routing-v2 # 👈 KEY CHANGE
|
routing_strategy: usage-based-routing-v2 # 👈 KEY CHANGE
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue