mirror of
https://github.com/python/cpython.git
synced 2026-05-18 02:15:28 -04:00
0afada163c
This caused installation errors in some cases on Windows. Patch by Julien Malard.
79 lines
2.0 KiB
Python
79 lines
2.0 KiB
Python
"""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
|
|
if stream.errors == 'strict':
|
|
# emulate backslashreplace error handler
|
|
encoding = stream.encoding
|
|
msg = msg.encode(encoding, "backslashreplace").decode(encoding)
|
|
try:
|
|
stream.write('%s\n' % msg)
|
|
except UnicodeEncodeError:
|
|
stream.write('%s\n' % msg.encode('unicode-escape').decode('ascii'))
|
|
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)
|