diff options
Diffstat (limited to 'bitbake/lib/bb/msg.py')
-rw-r--r-- | bitbake/lib/bb/msg.py | 204 |
1 files changed, 130 insertions, 74 deletions
diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index 21692d930d..1f9ff904af 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py @@ -23,12 +23,66 @@ Message handling infrastructure for bitbake # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys +import logging import collections +from itertools import groupby +import warnings import bb import bb.event -debug_level = collections.defaultdict(lambda: 0) -verbose = False +class BBLogFormatter(logging.Formatter): + """Formatter which ensures that our 'plain' messages (logging.INFO + 1) are used as is""" + + DEBUG3 = logging.DEBUG - 2 + DEBUG2 = logging.DEBUG - 1 + DEBUG = logging.DEBUG + VERBOSE = logging.INFO - 1 + NOTE = logging.INFO + PLAIN = logging.INFO + 1 + ERROR = logging.ERROR + WARNING = logging.WARNING + CRITICAL = logging.CRITICAL + + levelnames = { + DEBUG3 : 'DEBUG', + DEBUG2 : 'DEBUG', + DEBUG : 'DEBUG', + VERBOSE: 'NOTE', + NOTE : 'NOTE', + PLAIN : '', + WARNING : 'WARNING', + ERROR : 'ERROR', + CRITICAL: 'ERROR', + } + + def getLevelName(self, levelno): + try: + return self.levelnames[levelno] + except KeyError: + self.levelnames[levelno] = value = 'Level %d' % levelno + return value + + def format(self, record): + record.levelname = self.getLevelName(record.levelno) + if record.levelno == self.PLAIN: + return record.getMessage() + else: + return logging.Formatter.format(self, record) + +class Loggers(dict): + def __getitem__(self, key): + if key in self: + return dict.__getitem__(self, key) + else: + log = logging.getLogger("BitBake.%s" % domain._fields[key]) + dict.__setitem__(self, key, log) + return log + +class DebugLevel(dict): + def __getitem__(self, key): + if key == "default": + key = domain.Default + return get_debug_level(key) def _NamedTuple(name, fields): Tuple = collections.namedtuple(name, " ".join(fields)) @@ -48,97 +102,99 @@ domain = _NamedTuple("Domain", ( "RunQueue", "TaskData", "Util")) +logger = logging.getLogger("BitBake") +loggers = Loggers() +debug_level = DebugLevel() - -class MsgBase(bb.event.Event): - """Base class for messages""" - - def __init__(self, msg): - self._message = msg - bb.event.Event.__init__(self) - -class MsgDebug(MsgBase): - """Debug Message""" - -class MsgNote(MsgBase): - """Note Message""" - -class MsgWarn(MsgBase): - """Warning Message""" - -class MsgError(MsgBase): - """Error Message""" - -class MsgFatal(MsgBase): - """Fatal Message""" - -class MsgPlain(MsgBase): - """General output""" - -# # Message control functions # def set_debug_level(level): - for d in domain: - debug_level[d] = level - debug_level[domain.Default] = level + for log in loggers.itervalues(): + log.setLevel(logging.NOTSET) + + if level: + logger.setLevel(logging.DEBUG - level + 1) + else: + logger.setLevel(logging.INFO) def get_debug_level(msgdomain = domain.Default): - return debug_level[msgdomain] + if not msgdomain: + level = logger.getEffectiveLevel() + else: + level = loggers[msgdomain].getEffectiveLevel() + return max(0, logging.DEBUG - level + 1) def set_verbose(level): - verbose = level - -def set_debug_domains(strdomains): - for domainstr in strdomains: - for d in domain: - if domain._fields[d] == domainstr: - debug_level[d] += 1 + if level: + logger.setLevel(BBLogFormatter.VERBOSE) + else: + logger.setLevel(BBLogFormatter.INFO) + +def set_debug_domains(domainargs): + for (domainarg, iterator) in groupby(domainargs): + for index, msgdomain in enumerate(domain._fields): + if msgdomain == domainarg: + level = len(tuple(iterator)) + if level: + loggers[index].setLevel(logging.DEBUG - level + 1) break else: - warn(None, "Logging domain %s is not valid, ignoring" % domainstr) + warn(None, "Logging domain %s is not valid, ignoring" % domainarg) # # Message handling functions # -def debug(level, msgdomain, msg, fn = None): +def debug(level, msgdomain, msg): + warnings.warn("bb.msg.debug will soon be deprecated in favor of the python 'logging' module", + PendingDeprecationWarning, stacklevel=2) + level = logging.DEBUG - (level - 1) if not msgdomain: - msgdomain = domain.Default - - if debug_level[msgdomain] >= level: - bb.event.fire(MsgDebug(msg), None) - if bb.event.useStdout: - print('DEBUG: %s' % (msg)) + logger.debug(level, msg) + else: + loggers[msgdomain].debug(level, msg) + +def plain(msg): + warnings.warn("bb.msg.plain will soon be deprecated in favor of the python 'logging' module", + PendingDeprecationWarning, stacklevel=2) + logger.plain(msg) + +def note(level, msgdomain, msg): + warnings.warn("bb.msg.note will soon be deprecated in favor of the python 'logging' module", + PendingDeprecationWarning, stacklevel=2) + if level > 1: + if msgdomain: + logger.verbose(msg) + else: + loggers[msgdomain].verbose(msg) + else: + if msgdomain: + logger.info(msg) + else: + loggers[msgdomain].info(msg) -def note(level, msgdomain, msg, fn = None): +def warn(msgdomain, msg): + warnings.warn("bb.msg.warn will soon be deprecated in favor of the python 'logging' module", + PendingDeprecationWarning, stacklevel=2) if not msgdomain: - msgdomain = domain.Default + logger.warn(msg) + else: + loggers[msgdomain].warn(msg) - if level == 1 or verbose or debug_level[msgdomain] >= 1: - bb.event.fire(MsgNote(msg), None) - if bb.event.useStdout: - print('NOTE: %s' % (msg)) - -def warn(msgdomain, msg, fn = None): - bb.event.fire(MsgWarn(msg), None) - if bb.event.useStdout: - print('WARNING: %s' % (msg)) - -def error(msgdomain, msg, fn = None): - bb.event.fire(MsgError(msg), None) - if bb.event.useStdout: - print('ERROR: %s' % (msg)) - -def fatal(msgdomain, msg, fn = None): - bb.event.fire(MsgFatal(msg), None) +def error(msgdomain, msg): + warnings.warn("bb.msg.error will soon be deprecated in favor of the python 'logging' module", + PendingDeprecationWarning, stacklevel=2) + if not msgdomain: + logger.error(msg) + else: + loggers[msgdomain].error(msg) - if bb.event.useStdout: - print('FATAL: %s' % (msg)) +def fatal(msgdomain, msg): + warnings.warn("bb.msg.fatal will soon be deprecated in favor of raising appropriate exceptions", + PendingDeprecationWarning, stacklevel=2) + if not msgdomain: + logger.critical(msg) + else: + loggers[msgdomain].critical(msg) sys.exit(1) - -def plain(msg, fn = None): - bb.event.fire(MsgPlain(msg), None) - if bb.event.useStdout: - print(msg) |