cli.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import logging
  2. from typing import Any, Dict
  3. from rich_toolkit import RichToolkit, RichToolkitTheme
  4. from rich_toolkit.styles import TaggedStyle
  5. from uvicorn.logging import DefaultFormatter
  6. class CustomFormatter(DefaultFormatter):
  7. def __init__(self, *args: Any, **kwargs: Any) -> None:
  8. super().__init__(*args, **kwargs)
  9. self.toolkit = get_rich_toolkit()
  10. def formatMessage(self, record: logging.LogRecord) -> str:
  11. return self.toolkit.print_as_string(record.getMessage(), tag=record.levelname)
  12. def get_uvicorn_log_config() -> Dict[str, Any]:
  13. return {
  14. "version": 1,
  15. "disable_existing_loggers": False,
  16. "formatters": {
  17. "default": {
  18. "()": CustomFormatter,
  19. "fmt": "%(levelprefix)s %(message)s",
  20. "use_colors": None,
  21. },
  22. "access": {
  23. "()": CustomFormatter,
  24. "fmt": "%(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s",
  25. },
  26. },
  27. "handlers": {
  28. "default": {
  29. "formatter": "default",
  30. "class": "logging.StreamHandler",
  31. "stream": "ext://sys.stderr",
  32. },
  33. "access": {
  34. "formatter": "access",
  35. "class": "logging.StreamHandler",
  36. "stream": "ext://sys.stdout",
  37. },
  38. },
  39. "loggers": {
  40. "uvicorn": {"handlers": ["default"], "level": "INFO"},
  41. "uvicorn.error": {"level": "INFO"},
  42. "uvicorn.access": {
  43. "handlers": ["access"],
  44. "level": "INFO",
  45. "propagate": False,
  46. },
  47. },
  48. }
  49. logger = logging.getLogger(__name__)
  50. def get_rich_toolkit() -> RichToolkit:
  51. theme = RichToolkitTheme(
  52. style=TaggedStyle(tag_width=11),
  53. theme={
  54. "tag.title": "white on #009485",
  55. "tag": "white on #007166",
  56. "placeholder": "grey85",
  57. "text": "white",
  58. "selected": "#007166",
  59. "result": "grey85",
  60. "progress": "on #007166",
  61. "error": "red",
  62. "log.info": "black on blue",
  63. },
  64. )
  65. return RichToolkit(theme=theme)