You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					78 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					78 lines
				
				1.9 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"""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)
							 |