import logging import sys from loguru import logger from common.config.log_settings import log_settings def register(app=None): level = log_settings.LOG_LEVEL file_path = log_settings.LOG_PATH retention = log_settings.LOG_RETENTION rotation = log_settings.LOG_ROTATION # intercept everything at the root logger logging.root.handlers = [InterceptHandler()] logging.root.setLevel(level) # remove every other logger's handlers # and propagate to root logger for name in logging.root.manager.loggerDict.keys(): logging.getLogger(name).handlers = [] logging.getLogger(name).propagate = True # configure loguru logger.add(sink=sys.stdout) logger.add(sink=file_path, level=level, retention=retention, rotation=rotation) logger.disable("pika.adapters") logger.disable("pika.connection") logger.disable("pika.channel") logger.disable("pika.callback") logger.disable("pika.frame") logger.disable("pika.spec") logger.disable("aiormq.connection") logger.disable("urllib3.connectionpool") logging.getLogger("pymongo").setLevel( logging.WARNING ) # Suppress pymongo DEBUG logs class InterceptHandler(logging.Handler): def emit(self, record): # Get corresponding Loguru level if it exists try: level = logger.level(record.levelname).name except ValueError: level = record.levelno # Find caller from where originated the logged message frame, depth = logging.currentframe(), 2 while frame.f_code.co_filename == logging.__file__: frame = frame.f_back depth += 1 logger.opt(depth=depth, exception=record.exc_info).log( level, record.getMessage() )