import sys from os import environ as env from datetime import datetime # Custom logger class Log(): def __init__(self, minimum='INFO', datefmt='%Y-%m-%d %H:%M:%S', date=True): self.levels = { 'CRIT': 60, 'ERROR': 50, 'WARN': 40, 'INFO': 30, 'VERB': 20, 'DEBUG': 10, 'MERP': 0 } self.date = date self.datefmt = datefmt self.minimum = self._lvlCheck(minimum) # make sure the minimum logging level is an int def _lvlCheck(self, level): try: value = int(level) except ValueError: value = self.levels.get(level) if value not in self.levels.values(): raise InvalidLevel(f'Invalid logging level: {level}') return value def setLevel(self, level): self.minimum = self._lvlCheck(level) def log(self, level, msg): levelNum = self._lvlCheck(level) if type(level) == int: for k,v in self.levels.items(): if v == levelNum: level = k if levelNum < self.minimum: return output = f'{level}: {msg}\n' # Only show date when not running in systemd and date var is True if self.date and not env.get('INVOCATION_ID'): date = datetime.now().strftime(self.datefmt) output = f'{date} {output}' stdout = sys.stdout stdout.write(output) stdout.flush() def critical(self, msg): self.log('CRIT', msg) def error(self, msg): self.log('ERROR', msg) def warning(self, msg): self.log('WARN', msg) def info(self, msg): self.log('INFO', msg) def verbose(self, msg): self.log('VERB', msg) def debug(self, msg): self.log('DEBUG', msg) def merp(self, msg): self.log('MERP', msg) class InvalidType(Exception): '''Raise when the log level isn't a str or an int''' class InvalidLevel(Exception): '''Raise when an invalid logging level was specified'''