| """A simple log mechanism styled after PEP 282."""
|
|
|
|
|
|
|
|
|
| import sys
|
|
|
| DEBUG = 1
|
| INFO = 2
|
| WARN = 3
|
| ERROR = 4
|
| FATAL = 5
|
|
|
|
|
| class Log:
|
| def __init__(self, threshold=WARN):
|
| self.threshold = threshold
|
|
|
| def _log(self, level, msg, args):
|
| if level not in (DEBUG, INFO, WARN, ERROR, FATAL):
|
| raise ValueError('%s wrong log level' % str(level))
|
|
|
| if level >= self.threshold:
|
| if args:
|
| msg = msg % args
|
| if level in (WARN, ERROR, FATAL):
|
| stream = sys.stderr
|
| else:
|
| stream = sys.stdout
|
| try:
|
| stream.write('%s\n' % msg)
|
| except UnicodeEncodeError:
|
|
|
| encoding = stream.encoding
|
| msg = msg.encode(encoding, "backslashreplace").decode(encoding)
|
| stream.write('%s\n' % msg)
|
| stream.flush()
|
|
|
| def log(self, level, msg, *args):
|
| self._log(level, msg, args)
|
|
|
| def debug(self, msg, *args):
|
| self._log(DEBUG, msg, args)
|
|
|
| def info(self, msg, *args):
|
| self._log(INFO, msg, args)
|
|
|
| def warn(self, msg, *args):
|
| self._log(WARN, msg, args)
|
|
|
| def error(self, msg, *args):
|
| self._log(ERROR, msg, args)
|
|
|
| def fatal(self, msg, *args):
|
| self._log(FATAL, msg, args)
|
|
|
|
|
| _global_log = Log()
|
| log = _global_log.log
|
| debug = _global_log.debug
|
| info = _global_log.info
|
| warn = _global_log.warn
|
| error = _global_log.error
|
| fatal = _global_log.fatal
|
|
|
|
|
| def set_threshold(level):
|
|
|
| old = _global_log.threshold
|
| _global_log.threshold = level
|
| return old
|
|
|
|
|
| def set_verbosity(v):
|
| if v <= 0:
|
| set_threshold(WARN)
|
| elif v == 1:
|
| set_threshold(INFO)
|
| elif v >= 2:
|
| set_threshold(DEBUG)
|
|
|