1*cda5da8dSAndroid Build Coastguard Worker"""A simple log mechanism styled after PEP 282.""" 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker# The class here is styled after PEP 282 so that it could later be 4*cda5da8dSAndroid Build Coastguard Worker# replaced with a standard Python logging implementation. 5*cda5da8dSAndroid Build Coastguard Worker 6*cda5da8dSAndroid Build Coastguard WorkerDEBUG = 1 7*cda5da8dSAndroid Build Coastguard WorkerINFO = 2 8*cda5da8dSAndroid Build Coastguard WorkerWARN = 3 9*cda5da8dSAndroid Build Coastguard WorkerERROR = 4 10*cda5da8dSAndroid Build Coastguard WorkerFATAL = 5 11*cda5da8dSAndroid Build Coastguard Worker 12*cda5da8dSAndroid Build Coastguard Workerimport sys 13*cda5da8dSAndroid Build Coastguard Worker 14*cda5da8dSAndroid Build Coastguard Workerclass Log: 15*cda5da8dSAndroid Build Coastguard Worker 16*cda5da8dSAndroid Build Coastguard Worker def __init__(self, threshold=WARN): 17*cda5da8dSAndroid Build Coastguard Worker self.threshold = threshold 18*cda5da8dSAndroid Build Coastguard Worker 19*cda5da8dSAndroid Build Coastguard Worker def _log(self, level, msg, args): 20*cda5da8dSAndroid Build Coastguard Worker if level not in (DEBUG, INFO, WARN, ERROR, FATAL): 21*cda5da8dSAndroid Build Coastguard Worker raise ValueError('%s wrong log level' % str(level)) 22*cda5da8dSAndroid Build Coastguard Worker 23*cda5da8dSAndroid Build Coastguard Worker if level >= self.threshold: 24*cda5da8dSAndroid Build Coastguard Worker if args: 25*cda5da8dSAndroid Build Coastguard Worker msg = msg % args 26*cda5da8dSAndroid Build Coastguard Worker if level in (WARN, ERROR, FATAL): 27*cda5da8dSAndroid Build Coastguard Worker stream = sys.stderr 28*cda5da8dSAndroid Build Coastguard Worker else: 29*cda5da8dSAndroid Build Coastguard Worker stream = sys.stdout 30*cda5da8dSAndroid Build Coastguard Worker try: 31*cda5da8dSAndroid Build Coastguard Worker stream.write('%s\n' % msg) 32*cda5da8dSAndroid Build Coastguard Worker except UnicodeEncodeError: 33*cda5da8dSAndroid Build Coastguard Worker # emulate backslashreplace error handler 34*cda5da8dSAndroid Build Coastguard Worker encoding = stream.encoding 35*cda5da8dSAndroid Build Coastguard Worker msg = msg.encode(encoding, "backslashreplace").decode(encoding) 36*cda5da8dSAndroid Build Coastguard Worker stream.write('%s\n' % msg) 37*cda5da8dSAndroid Build Coastguard Worker stream.flush() 38*cda5da8dSAndroid Build Coastguard Worker 39*cda5da8dSAndroid Build Coastguard Worker def log(self, level, msg, *args): 40*cda5da8dSAndroid Build Coastguard Worker self._log(level, msg, args) 41*cda5da8dSAndroid Build Coastguard Worker 42*cda5da8dSAndroid Build Coastguard Worker def debug(self, msg, *args): 43*cda5da8dSAndroid Build Coastguard Worker self._log(DEBUG, msg, args) 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Worker def info(self, msg, *args): 46*cda5da8dSAndroid Build Coastguard Worker self._log(INFO, msg, args) 47*cda5da8dSAndroid Build Coastguard Worker 48*cda5da8dSAndroid Build Coastguard Worker def warn(self, msg, *args): 49*cda5da8dSAndroid Build Coastguard Worker self._log(WARN, msg, args) 50*cda5da8dSAndroid Build Coastguard Worker 51*cda5da8dSAndroid Build Coastguard Worker def error(self, msg, *args): 52*cda5da8dSAndroid Build Coastguard Worker self._log(ERROR, msg, args) 53*cda5da8dSAndroid Build Coastguard Worker 54*cda5da8dSAndroid Build Coastguard Worker def fatal(self, msg, *args): 55*cda5da8dSAndroid Build Coastguard Worker self._log(FATAL, msg, args) 56*cda5da8dSAndroid Build Coastguard Worker 57*cda5da8dSAndroid Build Coastguard Worker_global_log = Log() 58*cda5da8dSAndroid Build Coastguard Workerlog = _global_log.log 59*cda5da8dSAndroid Build Coastguard Workerdebug = _global_log.debug 60*cda5da8dSAndroid Build Coastguard Workerinfo = _global_log.info 61*cda5da8dSAndroid Build Coastguard Workerwarn = _global_log.warn 62*cda5da8dSAndroid Build Coastguard Workererror = _global_log.error 63*cda5da8dSAndroid Build Coastguard Workerfatal = _global_log.fatal 64*cda5da8dSAndroid Build Coastguard Worker 65*cda5da8dSAndroid Build Coastguard Workerdef set_threshold(level): 66*cda5da8dSAndroid Build Coastguard Worker # return the old threshold for use from tests 67*cda5da8dSAndroid Build Coastguard Worker old = _global_log.threshold 68*cda5da8dSAndroid Build Coastguard Worker _global_log.threshold = level 69*cda5da8dSAndroid Build Coastguard Worker return old 70*cda5da8dSAndroid Build Coastguard Worker 71*cda5da8dSAndroid Build Coastguard Workerdef set_verbosity(v): 72*cda5da8dSAndroid Build Coastguard Worker if v <= 0: 73*cda5da8dSAndroid Build Coastguard Worker set_threshold(WARN) 74*cda5da8dSAndroid Build Coastguard Worker elif v == 1: 75*cda5da8dSAndroid Build Coastguard Worker set_threshold(INFO) 76*cda5da8dSAndroid Build Coastguard Worker elif v >= 2: 77*cda5da8dSAndroid Build Coastguard Worker set_threshold(DEBUG) 78