Files
prop-data-guard/backend/.venv/lib/python3.9/site-packages/fastapi_cli/utils/cli.py
T
2026-04-22 17:07:33 +08:00

82 lines
2.4 KiB
Python

import logging
from typing import Any
from rich_toolkit import RichToolkit, RichToolkitTheme
from rich_toolkit.styles import TaggedStyle
from uvicorn.logging import DefaultFormatter
class CustomFormatter(DefaultFormatter):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self.toolkit = get_rich_toolkit()
def formatMessage(self, record: logging.LogRecord) -> str:
message = record.getMessage()
result = self.toolkit.print_as_string(message, tag=record.levelname)
# Prepend newline to fix alignment after ^C is printed by the terminal
if message == "Shutting down":
result = "\n" + result
return result
def get_uvicorn_log_config() -> dict[str, Any]:
return {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"()": CustomFormatter,
"fmt": "%(levelprefix)s %(message)s",
"use_colors": None,
},
"access": {
"()": CustomFormatter,
"fmt": "%(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s",
},
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stderr",
},
"access": {
"formatter": "access",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout",
},
},
"loggers": {
"uvicorn": {"handlers": ["default"], "level": "INFO"},
"uvicorn.error": {"level": "INFO"},
"uvicorn.access": {
"handlers": ["access"],
"level": "INFO",
"propagate": False,
},
},
}
logger = logging.getLogger(__name__)
def get_rich_toolkit() -> RichToolkit:
theme = RichToolkitTheme(
style=TaggedStyle(tag_width=11),
theme={
"tag.title": "white on #009485",
"tag": "white on #007166",
"placeholder": "grey85",
"text": "white",
"selected": "#007166",
"result": "grey85",
"progress": "on #007166",
"error": "red",
"log.info": "black on blue",
},
)
return RichToolkit(theme=theme)