""" Interface for the use of the loggers in Biogeme:author: Michel Bierlaire:date: Thu Mar 23 17:53:22 2023"""importloggingfromcontextlibimportcontextmanagerDEBUG=logging.DEBUGINFO=logging.INFOWARNING=logging.WARNINGERROR=logging.ERRORCRITICAL=logging.CRITICALloggers=(logging.getLogger('biogeme'),logging.getLogger('biogeme_optimization'),)
[docs]defget_screen_logger(level:int=WARNING)->logging.Logger:"""Obtain a screen logger :param level: level of verbosity of the logger :type level: int """forloggerinloggers:# This has to be set to the lower level: DEBUG so that it does not# supersed the handlerlogger.setLevel(DEBUG)formatter_debug=logging.Formatter('[%(levelname)s] %(asctime)s%(message)s <%(filename)s:%(lineno)d>')formatter_normal=logging.Formatter('%(message)s ')formatter=formatter_debugiflevel==DEBUGelseformatter_normalstream_handler=logging.StreamHandler()stream_handler.setLevel(level)stream_handler.setFormatter(formatter)logger.addHandler(stream_handler)returnloggers[0]
[docs]defget_file_logger(filename:str,level:int=WARNING)->logging.Logger:"""Obtain a file logger :param filename: name of the file. Extension .log recommended. :type filename: str :param level: level of verbosity of the logger :type level: int """forloggerinloggers:# This has to be set to the lower level: DEBUG so that it does not# supersed the handlerlogger.setLevel(DEBUG)formatter=logging.Formatter('[%(levelname)s] %(asctime)s%(message)s <%(filename)s:%(lineno)d>')file_handler=logging.FileHandler(filename)file_handler.setLevel(level)file_handler.setFormatter(formatter)logger.addHandler(file_handler)returnloggers[0]
[docs]@contextmanagerdefsuppress_logs(level=logging.WARNING):"""Temporarily suppress logs below a certain level."""old_levels=[logger.getEffectiveLevel()forloggerinloggers]# Apply a filterclassMaxLevelFilter(logging.Filter):deffilter(self,record):returnrecord.levelno>=levelfilters=[]forloggerinloggers:forhandlerinlogger.handlers:filt=MaxLevelFilter()handler.addFilter(filt)filters.append((handler,filt))try:yieldfinally:forhandler,filtinfilters:handler.removeFilter(filt)forlogger,old_levelinzip(loggers,old_levels):logger.setLevel(old_level)