[docs]classInterceptHandler(logging.Handler):"""intercept python logging messages and log them via loguru.logger. :param Handler logging: log handler """
[docs]defemit(self,record:Any)->None:# Get corresponding Loguru level if it existstry:level=logger.level(record.levelname).nameexceptValueError:level=record.levelno# Find caller from where originated the logged messageframe,depth=logging.currentframe(),2whileframe.f_code.co_filename==logging.__file__:# pyright:ignoreframe=frame.f_back# type: ignoredepth+=1logger.opt(depth=depth,exception=record.exc_info).log(level,record.getMessage())
[docs]defprepare_logger(loglevel:int=20,logfile:Path|None=None)->None:"""prepare loguru logger and create intercept handle, to capture other logs. :param int loglevel: loglevel to set, defaults to 20 :param Path | None logfile: logfile to save logs to. not saved to file if None, defaults to None """stdout_handler:dict[str,Any]={"sink":sys.stdout,"level":loglevel,"format":LOGURU_FMT,}file_handler:dict[str,Any]={"sink":logfile,"level":loglevel,"format":LOGURU_FMT,}handler_config=[stdout_handler,file_handler]iflogfileelse[stdout_handler]logging.basicConfig(handlers=[InterceptHandler()],level=loglevel)logger.configure(handlers=handler_config)