import sys CRITICAL = 50 ERROR = 40 WARNING = 30 INFO = 20 DEBUG = 10 NOTSET = 0 _level_dict = { CRITICAL: "CRIT", ERROR: "ERROR", WARNING: "WARN", INFO: "INFO", DEBUG: "DEBUG", } _stream = sys.stderr class Logger: level = NOTSET def __init__(self, name): self.name = name def _level_str(self, level): l = _level_dict.get(level) if l is not None: return l return "LVL%s" % level def setLevel(self, level): self.level = level def isEnabledFor(self, level): return level >= (self.level or _level) def log(self, level, msg, *args): if level >= (self.level or _level): _stream.write("%s:%s:" % (self._level_str(level), self.name)) if not args: print(msg, file=_stream) else: print(msg % args, file=_stream) def debug(self, msg, *args): self.log(DEBUG, msg, *args) def info(self, msg, *args): self.log(INFO, msg, *args) def warning(self, msg, *args): self.log(WARNING, msg, *args) def error(self, msg, *args): self.log(ERROR, msg, *args) def critical(self, msg, *args): self.log(CRITICAL, msg, *args) def exc(self, e, msg, *args): self.log(ERROR, msg, *args) sys.print_exception(e, _stream) def exception(self, msg, *args): self.exc(sys.exc_info()[1], msg, *args) _level = INFO _loggers = {} def getLogger(name): if name in _loggers: return _loggers[name] l = Logger(name) _loggers[name] = l return l def info(msg, *args): getLogger(None).info(msg, *args) def debug(msg, *args): getLogger(None).debug(msg, *args) def basicConfig(level=INFO, filename=None, stream=None, format=None): global _level, _stream _level = level if stream: _stream = stream if filename is not None: print("logging.basicConfig: filename arg is not supported") if format is not None: print("logging.basicConfig: format arg is not supported")