xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/distutils/log.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
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