Merge pull request #3737 from BerriAI/litellm_json_logs

feat(proxy_cli.py): support json logs on proxy
This commit is contained in:
Krish Dholakia 2024-05-20 09:46:37 -07:00 committed by GitHub
commit 626e556e70
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 73 additions and 11 deletions

View file

@ -5,6 +5,8 @@
- debug (prints info logs)
- detailed debug (prints debug logs)
The proxy also supports json logs. [See here](#json-logs)
## `debug`
**via cli**
@ -31,4 +33,20 @@ $ litellm --detailed_debug
```python
os.environ["LITELLM_LOG"] = "DEBUG"
```
```
## JSON LOGS
Set `JSON_LOGS="True"` in your env:
```bash
export JSON_LOGS="True"
```
Start proxy
```bash
$ litellm
```
The proxy will now all logs in json format.

View file

@ -1,19 +1,33 @@
import logging
import logging, os, json
from logging import Formatter
set_verbose = False
json_logs = False
json_logs = bool(os.getenv("JSON_LOGS", False))
# Create a handler for the logger (you may need to adapt this based on your needs)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
class JsonFormatter(Formatter):
def __init__(self):
super(JsonFormatter, self).__init__()
def format(self, record):
json_record = {}
json_record["message"] = record.getMessage()
return json.dumps(json_record)
# Create a formatter and set it for the handler
formatter = logging.Formatter(
"\033[92m%(asctime)s - %(name)s:%(levelname)s\033[0m: %(filename)s:%(lineno)s - %(message)s",
datefmt="%H:%M:%S",
)
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)
handler.setFormatter(formatter)
verbose_proxy_logger = logging.getLogger("LiteLLM Proxy")
verbose_router_logger = logging.getLogger("LiteLLM Router")

20
litellm/proxy/_logging.py Normal file
View file

@ -0,0 +1,20 @@
import json
import logging
from logging import Formatter
class JsonFormatter(Formatter):
def __init__(self):
super(JsonFormatter, self).__init__()
def format(self, record):
json_record = {}
json_record["message"] = record.getMessage()
return json.dumps(json_record)
logger = logging.root
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger.handlers = [handler]
logger.setLevel(logging.DEBUG)

View file

@ -17,4 +17,4 @@ model_list:
api_key: os.environ/AZURE_API_KEY # The `os.environ/` prefix tells litellm to read this from the env. See https://docs.litellm.ai/docs/simple_proxy#load-api-keys-from-vault
router_settings:
enable_pre_call_checks: true
enable_pre_call_checks: true

View file

@ -17,6 +17,7 @@ if litellm_mode == "DEV":
from importlib import resources
import shutil
telemetry = None
@ -505,6 +506,7 @@ def run_server(
port = random.randint(1024, 49152)
from litellm.proxy.proxy_server import app
import litellm
if run_gunicorn == False:
if ssl_certfile_path is not None and ssl_keyfile_path is not None:
@ -519,7 +521,15 @@ def run_server(
ssl_certfile=ssl_certfile_path,
) # run uvicorn
else:
uvicorn.run(app, host=host, port=port) # run uvicorn
print(f"litellm.json_logs: {litellm.json_logs}")
if litellm.json_logs:
from litellm.proxy._logging import logger
uvicorn.run(
app, host=host, port=port, log_config=None
) # run uvicorn w/ json
else:
uvicorn.run(app, host=host, port=port) # run uvicorn
elif run_gunicorn == True:
import gunicorn.app.base