[docs]classTimestamp:"""timestamp class for logging related strings."""
[docs]def__init__(self,timezone:str="Europe/Zurich",timestamp_format:str="%Y-%m-%dT%H:%M:%S")->None:"""Set timezone and format specific preferences. Args: timezone: timezone to use for timestamps. timestamp_format: `strftime` format string to use for timestamps. """self.timezone=timezoneself.timestamp_format=timestamp_format
[docs]classInterceptHandler(logging.Handler):"""Intercept python logging messages and log them via loguru.logger."""
[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: ignore[reportOptionalMemberAccess]frame=frame.f_back# type: ignore # noqa: PGH003depth+=1logger.opt(depth=depth,exception=record.exc_info).log(level,record.getMessage())
[docs]defprepare_logger(loglevel:int=20,logfile:Path|None=None,logfmt:str="<level>{time:YYYY-MM-DD HH:mm:ss zz} [{level}]</> <c>[{name}]</> {message}",)->None:"""Init logger with specified loglevel and logfile. Args: loglevel: level to set. 10 = debug, 20 = info, 30 = warning, etc. logfile: logfile to write log messages into. logfmt: log string format to use. """stdout_handler:dict[str,Any]={"sink":sys.stdout,"level":loglevel,"format":logfmt,"colorize":True,}file_handler:dict[str,Any]={"sink":logfile,"level":loglevel,"format":logfmt,"colorize":False,}handlers=[stdout_handler,file_handler]iflogfileelse[stdout_handler]logging.basicConfig(handlers=[InterceptHandler()],level=loglevel)logger.configure(handlers=handlers)# pyright: ignore[reportArgumentType]