Source code for digideep.utility.logging

import time
from colorama import Style, Fore

[docs]class Logger: """ This is a helper class which is intended to simplify logging in a single file from different modules in a package. The ``Logger`` class uses a singleton [#]_ pattern. It also provides multi-level logging each in a specific style. The levels are ``DEBUG``, ``INFO``, ``WARN``, ``ERROR``, ``FATAL``. .. code-block:: python :caption: Example logger.set_log_level(2) logger.info('This is a test of type INFO.') # Will not be shown logger.warn('This is a test of type WARN.') # Will be shown logger.fatal('This is a test of type FATAL.') # Will be shown logger.set_log_level(3) logger.info('This is a test of type INFO.') # Will not be shown logger.warn('This is a test of type WARN.') # Will not be shown logger.fatal('This is a test of type FATAL.') # Will be shown logger.set_logfile('path_to_the_log_file') # ... All logs will be stored in the specified file from now on. # They will be shown on the output as well. .. rubric:: Footnotes .. [#] https://gist.github.com/pazdera/1098129 """ # Here will be the instance stored. __instance = None
[docs] @staticmethod def getInstance(): """ Static access method. """ if Logger.__instance == None: Logger() return Logger.__instance
def __init__(self): """ Virtually private constructor. """ if Logger.__instance != None: raise Exception("This class is a singleton!") else: Logger.__instance = self self.time_origin = time.time() self.filename = None self.LEVELS = {'DEBUG':0, 'INFO':1, 'WARN':2, 'ERROR':3, 'FATAL':4} self.COLORS = {'DEBUG':Style.DIM, 'INFO':Fore.GREEN, 'WARN':Fore.YELLOW, 'ERROR':Fore.RED, 'FATAL':Fore.RED+Style.BRIGHT} self.log_level = 1
[docs] def set_logfile(self, filename): self.filename = filename
[docs] def set_log_level(self, log_level): self.log_level = log_level
def _log(self, *args, sep=' ', end='\n', flush=False, level='INFO'): if self.LEVELS[level] >= self.log_level: elapsed_time = '[%12.5fs, %5s]'%(time.time()-self.time_origin, level) print(self.COLORS[level], elapsed_time, *args, Style.RESET_ALL, sep=sep, end=end, flush=flush) if self.filename: f = open(self.filename, 'a') print(elapsed_time, *args, sep=sep, end=end, flush=flush, file=f) f.close() def __call__(self, *args, sep=' ', end='\n', flush=False, level='INFO'): self._log(*args, sep=sep, end=end, flush=flush, level=level)
[docs] def debug(self, *args, sep=' ', end='\n', flush=False): self._log(*args, sep=sep, end=end, flush=flush, level='DEBUG')
[docs] def info(self, *args, sep=' ', end='\n', flush=False): self._log(*args, sep=sep, end=end, flush=flush, level='INFO')
[docs] def warn(self, *args, sep=' ', end='\n', flush=False): self._log(*args, sep=sep, end=end, flush=flush, level='WARN')
[docs] def error(self, *args, sep=' ', end='\n', flush=False): self._log(*args, sep=sep, end=end, flush=flush, level='ERROR')
[docs] def fatal(self, *args, sep=' ', end='\n', flush=False): self._log(*args, sep=sep, end=end, flush=flush, level='FATAL')
logger = Logger.getInstance() if __name__=='__main__': logger.set_log_level(0) logger.debug('This is a debug message!') logger.info('This is an info message!') logger.warn('This is a warn message!') logger.error('This is an error message!') logger.fatal('This is a fatal message!') # class Logger(object): # def __init__(self, filename): # self.filename = filename # self.time_origin = time.time() # def __call__(self, *args, sep=' ', end='\n', flush=False): # elapsed_time = '[%12.5fs]'%(time.time()-self.time_origin) # print(elapsed_time, *args, sep=sep, end=end, flush=flush) # f = open(self.filename, 'a') # print(elapsed_time, *args, sep=sep, end=end, flush=flush, file=f) # f.close()