| """A simple log mechanism styled after PEP 282.""" |
|
|
| |
| |
|
|
| DEBUG = 1 |
| INFO = 2 |
| WARN = 3 |
| ERROR = 4 |
| FATAL = 5 |
|
|
| import sys |
|
|
| 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) |
|
|