import logging from typing import Any, Dict 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: return self.toolkit.print_as_string(record.getMessage(), tag=record.levelname) 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)