mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-06 08:16:43 +00:00
Merge pull request #3737 from BerriAI/litellm_json_logs
feat(proxy_cli.py): support json logs on proxy
This commit is contained in:
commit
626e556e70
5 changed files with 73 additions and 11 deletions
|
|
@ -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.
|
||||
|
|
@ -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
20
litellm/proxy/_logging.py
Normal 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)
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue