logging_provider.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import logging
  2. import sys
  3. from loguru import logger
  4. from config.logging import settings
  5. def register(app=None):
  6. level = settings.LOG_LEVEL
  7. path = settings.LOG_PATH
  8. retention = settings.LOG_RETENTION
  9. # intercept everything at the root logger
  10. logging.root.handlers = [InterceptHandler()]
  11. logging.root.setLevel(level)
  12. # remove every other logger's handlers
  13. # and propagate to root logger
  14. for name in logging.root.manager.loggerDict.keys():
  15. logging.getLogger(name).handlers = []
  16. logging.getLogger(name).propagate = True
  17. # configure loguru
  18. logger.configure(
  19. handlers=[
  20. {"sink": sys.stdout},
  21. {"sink": path, "rotation": "00:00", "retention": retention},
  22. ]
  23. )
  24. class InterceptHandler(logging.Handler):
  25. def emit(self, record):
  26. # Get corresponding Loguru level if it exists
  27. try:
  28. level = logger.level(record.levelname).name
  29. except ValueError:
  30. level = record.levelno
  31. # Find caller from where originated the logged message
  32. frame, depth = logging.currentframe(), 2
  33. while frame.f_code.co_filename == logging.__file__:
  34. frame = frame.f_back
  35. depth += 1
  36. logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())