Spaces:
Runtime error
Runtime error
"""A simple log mechanism styled after PEP 282.""" | |
# The class here is styled after PEP 282 so that it could later be | |
# replaced with a standard Python logging implementation. | |
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: | |
# emulate backslashreplace error handler | |
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): | |
# return the old threshold for use from tests | |
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) | |