"""Provides a custom logger object.Should be used like the following:.. code-block:: python from cambrian.utils.logger import get_logger get_logger().fatal("Fatal") get_logger().error("Error") get_logger().warn("Warning") get_logger().info("Information") get_logger().debug("Debug")"""importlogging
[docs]classMjCambrianFileHandler(logging.FileHandler):"""A file handler which creates the directory if it doesn't exist."""def__init__(self,filename,*args,**kwargs):# Create the file before calling the super constructorimportosos.makedirs(os.path.dirname(filename),exist_ok=True)super().__init__(filename,*args,**kwargs)
[docs]classMjCambrianTqdmStreamHandler(logging.StreamHandler):"""A handler that uses tqdm.write to log messages."""
[docs]classMjCambrianLoggerMaxLevelFilter(logging.Filter):"""This filter sets a maximum level."""def__init__(self,max_level:str):self._max_level=logging.getLevelName(max_level)
[docs]classMjCambrianOnceFilter(logging.Filter):"""This filter allows a message to be logged only once."""def__init__(self):super().__init__()self.extra_once_used=False
[docs]deffilter(self,record:logging.LogRecord)->bool:# Allow one-time use of "once"ifgetattr(record,"once",False):ifnotself.extra_once_used:self.extra_once_used=TruereturnTruereturnFalse# Block subsequent "once" warningsreturnTrue