[docs]classBaseLogger(object):""" A base class for logger constructor. """def__init__(self,name=None,**kwargs):self.logger=logging.getLogger(name)self.tab=" "*4self.enable=Trueself._handler_cache=list()def_indent(self,msg,indent):return"%s%s"%(self.tab*indent,msg)defdebug(self,msg,indent=0,**kwargs):returnself.logger.debug(self._indent(msg,indent),**kwargs)definfo(self,msg,indent=0,**kwargs):returnself.logger.info(self._indent(msg,indent),**kwargs)defwarning(self,msg,indent=0,**kwargs):returnself.logger.warning(self._indent(msg,indent),**kwargs)deferror(self,msg,indent=0,**kwargs):returnself.logger.error(self._indent(msg,indent),**kwargs)defcritical(self,msg,indent=0,**kwargs):returnself.logger.critical(self._indent(msg,indent),**kwargs)
[docs]defremove_all_handler(self):""" Unlink the file handler association. """forhandlerinself.logger.handlers[:]:self.logger.removeHandler(handler)self._handler_cache.append(handler)
[docs]defrecover_all_handler(self):""" Relink the file handler association you just removed. """forhandlerinself._handler_cache:self.logger.addHandler(handler)self._handler_cache=list()
[docs]@decohintsdefdecorator(self,func):""" A decorator that allow you to use ``verbose`` parameter to temporarily disable logging in the given function. (default is enabled) Example:: @logger.decorator def my_func(name): logger.info(f"hello {name}!") my_func("alice") # this will print "hello alice" my_func("alice", verbose=False) # this will print nothing """@functools.wraps(func)defwrapper(*args,**kwargs):if"verbose"inkwargs:verbose=kwargs.pop("verbose")else:verbose=Truewithself.temp_disable(disable=notverbose):returnfunc(*args,**kwargs)returnwrapper
[docs]classStreamOnlyLogger(BaseLogger):""" This logger only print message to console, and not write log to file. :param stream_level: level above this will be streamed. :param stream_format: log information format. """def__init__(self,name=None,stream_level=logging.INFO,stream_format=DEFAULT_STREAM_FORMAT,):super(StreamOnlyLogger,self).__init__(name)# Set Logging Levelself.logger.setLevel(logging.DEBUG)# Set Stream Handlerset_stream_handler(self.logger,stream_level,stream_format)