report.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from __future__ import annotations
  2. import logging
  3. import sys
  4. LEVELS = {
  5. 0: logging.CRITICAL,
  6. 1: logging.ERROR,
  7. 2: logging.WARNING,
  8. 3: logging.INFO,
  9. 4: logging.DEBUG,
  10. 5: logging.NOTSET,
  11. }
  12. MAX_LEVEL = max(LEVELS.keys())
  13. LOGGER = logging.getLogger()
  14. def setup_report(verbosity: int, show_pid: bool = False) -> int: # noqa: FBT002
  15. _clean_handlers(LOGGER)
  16. verbosity = min(verbosity, MAX_LEVEL) # pragma: no cover
  17. level = LEVELS[verbosity]
  18. msg_format = "%(message)s"
  19. if level <= logging.DEBUG:
  20. locate = "module"
  21. msg_format = f"%(relativeCreated)d {msg_format} [%(levelname)s %({locate})s:%(lineno)d]"
  22. if show_pid:
  23. msg_format = f"[%(process)d] {msg_format}"
  24. formatter = logging.Formatter(msg_format)
  25. stream_handler = logging.StreamHandler(stream=sys.stdout)
  26. stream_handler.setLevel(level)
  27. LOGGER.setLevel(logging.NOTSET)
  28. stream_handler.setFormatter(formatter)
  29. LOGGER.addHandler(stream_handler)
  30. level_name = logging.getLevelName(level)
  31. LOGGER.debug("setup logging to %s", level_name)
  32. logging.getLogger("distlib").setLevel(logging.ERROR)
  33. return verbosity
  34. def _clean_handlers(log: logging.Logger) -> None:
  35. for log_handler in list(log.handlers): # remove handlers of libraries
  36. log.removeHandler(log_handler)
  37. __all__ = [
  38. "LEVELS",
  39. "MAX_LEVEL",
  40. "setup_report",
  41. ]