diff options
| -rw-r--r-- | bitbake/lib/bb/__init__.py | 13 | ||||
| -rw-r--r-- | bitbake/lib/bb/msg.py | 32 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/knotty.py | 14 |
3 files changed, 51 insertions, 8 deletions
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index e01b8d5256..269f65edce 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py | |||
| @@ -71,6 +71,13 @@ class BBLoggerMixin(object): | |||
| 71 | def verbnote(self, msg, *args, **kwargs): | 71 | def verbnote(self, msg, *args, **kwargs): |
| 72 | return self.log(logging.INFO + 2, msg, *args, **kwargs) | 72 | return self.log(logging.INFO + 2, msg, *args, **kwargs) |
| 73 | 73 | ||
| 74 | def warnonce(self, msg, *args, **kwargs): | ||
| 75 | return self.log(logging.WARNING - 1, msg, *args, **kwargs) | ||
| 76 | |||
| 77 | def erroronce(self, msg, *args, **kwargs): | ||
| 78 | return self.log(logging.ERROR - 1, msg, *args, **kwargs) | ||
| 79 | |||
| 80 | |||
| 74 | Logger = logging.getLoggerClass() | 81 | Logger = logging.getLoggerClass() |
| 75 | class BBLogger(Logger, BBLoggerMixin): | 82 | class BBLogger(Logger, BBLoggerMixin): |
| 76 | def __init__(self, name, *args, **kwargs): | 83 | def __init__(self, name, *args, **kwargs): |
| @@ -157,9 +164,15 @@ def verbnote(*args): | |||
| 157 | def warn(*args): | 164 | def warn(*args): |
| 158 | mainlogger.warning(''.join(args)) | 165 | mainlogger.warning(''.join(args)) |
| 159 | 166 | ||
| 167 | def warnonce(*args): | ||
| 168 | mainlogger.warnonce(''.join(args)) | ||
| 169 | |||
| 160 | def error(*args, **kwargs): | 170 | def error(*args, **kwargs): |
| 161 | mainlogger.error(''.join(args), extra=kwargs) | 171 | mainlogger.error(''.join(args), extra=kwargs) |
| 162 | 172 | ||
| 173 | def erroronce(*args): | ||
| 174 | mainlogger.erroronce(''.join(args)) | ||
| 175 | |||
| 163 | def fatal(*args, **kwargs): | 176 | def fatal(*args, **kwargs): |
| 164 | mainlogger.critical(''.join(args), extra=kwargs) | 177 | mainlogger.critical(''.join(args), extra=kwargs) |
| 165 | raise BBHandledException() | 178 | raise BBHandledException() |
diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index 291b38ff7f..512ec1f5c1 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py | |||
| @@ -30,7 +30,9 @@ class BBLogFormatter(logging.Formatter): | |||
| 30 | PLAIN = logging.INFO + 1 | 30 | PLAIN = logging.INFO + 1 |
| 31 | VERBNOTE = logging.INFO + 2 | 31 | VERBNOTE = logging.INFO + 2 |
| 32 | ERROR = logging.ERROR | 32 | ERROR = logging.ERROR |
| 33 | ERRORONCE = logging.ERROR - 1 | ||
| 33 | WARNING = logging.WARNING | 34 | WARNING = logging.WARNING |
| 35 | WARNONCE = logging.WARNING - 1 | ||
| 34 | CRITICAL = logging.CRITICAL | 36 | CRITICAL = logging.CRITICAL |
| 35 | 37 | ||
| 36 | levelnames = { | 38 | levelnames = { |
| @@ -42,7 +44,9 @@ class BBLogFormatter(logging.Formatter): | |||
| 42 | PLAIN : '', | 44 | PLAIN : '', |
| 43 | VERBNOTE: 'NOTE', | 45 | VERBNOTE: 'NOTE', |
| 44 | WARNING : 'WARNING', | 46 | WARNING : 'WARNING', |
| 47 | WARNONCE : 'WARNING', | ||
| 45 | ERROR : 'ERROR', | 48 | ERROR : 'ERROR', |
| 49 | ERRORONCE : 'ERROR', | ||
| 46 | CRITICAL: 'ERROR', | 50 | CRITICAL: 'ERROR', |
| 47 | } | 51 | } |
| 48 | 52 | ||
| @@ -58,7 +62,9 @@ class BBLogFormatter(logging.Formatter): | |||
| 58 | PLAIN : BASECOLOR, | 62 | PLAIN : BASECOLOR, |
| 59 | VERBNOTE: BASECOLOR, | 63 | VERBNOTE: BASECOLOR, |
| 60 | WARNING : YELLOW, | 64 | WARNING : YELLOW, |
| 65 | WARNONCE : YELLOW, | ||
| 61 | ERROR : RED, | 66 | ERROR : RED, |
| 67 | ERRORONCE : RED, | ||
| 62 | CRITICAL: RED, | 68 | CRITICAL: RED, |
| 63 | } | 69 | } |
| 64 | 70 | ||
| @@ -121,6 +127,23 @@ class BBLogFilter(object): | |||
| 121 | return True | 127 | return True |
| 122 | return False | 128 | return False |
| 123 | 129 | ||
| 130 | class LogFilterShowOnce(logging.Filter): | ||
| 131 | def __init__(self): | ||
| 132 | self.seen_warnings = set() | ||
| 133 | self.seen_errors = set() | ||
| 134 | |||
| 135 | def filter(self, record): | ||
| 136 | msg = record.msg | ||
| 137 | if record.levelno == bb.msg.BBLogFormatter.WARNONCE: | ||
| 138 | if record.msg in self.seen_warnings: | ||
| 139 | return False | ||
| 140 | self.seen_warnings.add(record.msg) | ||
| 141 | if record.levelno == bb.msg.BBLogFormatter.ERRORONCE: | ||
| 142 | if record.msg in self.seen_errors: | ||
| 143 | return False | ||
| 144 | self.seen_errors.add(record.msg) | ||
| 145 | return True | ||
| 146 | |||
| 124 | class LogFilterGEQLevel(logging.Filter): | 147 | class LogFilterGEQLevel(logging.Filter): |
| 125 | def __init__(self, level): | 148 | def __init__(self, level): |
| 126 | self.strlevel = str(level) | 149 | self.strlevel = str(level) |
| @@ -293,10 +316,17 @@ def setLoggingConfig(defaultconfig, userconfigfile=None): | |||
| 293 | 316 | ||
| 294 | # Convert all level parameters to integers in case users want to use the | 317 | # Convert all level parameters to integers in case users want to use the |
| 295 | # bitbake defined level names | 318 | # bitbake defined level names |
| 296 | for h in logconfig["handlers"].values(): | 319 | for name, h in logconfig["handlers"].items(): |
| 297 | if "level" in h: | 320 | if "level" in h: |
| 298 | h["level"] = bb.msg.stringToLevel(h["level"]) | 321 | h["level"] = bb.msg.stringToLevel(h["level"]) |
| 299 | 322 | ||
| 323 | # Every handler needs its own instance of the once filter. | ||
| 324 | once_filter_name = name + ".showonceFilter" | ||
| 325 | logconfig.setdefault("filters", {})[once_filter_name] = { | ||
| 326 | "()": "bb.msg.LogFilterShowOnce", | ||
| 327 | } | ||
| 328 | h.setdefault("filters", []).append(once_filter_name) | ||
| 329 | |||
| 300 | for l in logconfig["loggers"].values(): | 330 | for l in logconfig["loggers"].values(): |
| 301 | if "level" in l: | 331 | if "level" in l: |
| 302 | l["level"] = bb.msg.stringToLevel(l["level"]) | 332 | l["level"] = bb.msg.stringToLevel(l["level"]) |
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py index 484545a684..8b98da1771 100644 --- a/bitbake/lib/bb/ui/knotty.py +++ b/bitbake/lib/bb/ui/knotty.py | |||
| @@ -647,7 +647,7 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
| 647 | if isinstance(event, logging.LogRecord): | 647 | if isinstance(event, logging.LogRecord): |
| 648 | lastprint = time.time() | 648 | lastprint = time.time() |
| 649 | printinterval = 5000 | 649 | printinterval = 5000 |
| 650 | if event.levelno >= bb.msg.BBLogFormatter.ERROR: | 650 | if event.levelno >= bb.msg.BBLogFormatter.ERRORONCE: |
| 651 | errors = errors + 1 | 651 | errors = errors + 1 |
| 652 | return_value = 1 | 652 | return_value = 1 |
| 653 | elif event.levelno == bb.msg.BBLogFormatter.WARNING: | 653 | elif event.levelno == bb.msg.BBLogFormatter.WARNING: |
| @@ -661,10 +661,10 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
| 661 | continue | 661 | continue |
| 662 | 662 | ||
| 663 | # Prefix task messages with recipe/task | 663 | # Prefix task messages with recipe/task |
| 664 | if event.taskpid in helper.pidmap and event.levelno != bb.msg.BBLogFormatter.PLAIN: | 664 | if event.taskpid in helper.pidmap and event.levelno not in [bb.msg.BBLogFormatter.PLAIN, bb.msg.BBLogFormatter.WARNONCE, bb.msg.BBLogFormatter.ERRORONCE]: |
| 665 | taskinfo = helper.running_tasks[helper.pidmap[event.taskpid]] | 665 | taskinfo = helper.running_tasks[helper.pidmap[event.taskpid]] |
| 666 | event.msg = taskinfo['title'] + ': ' + event.msg | 666 | event.msg = taskinfo['title'] + ': ' + event.msg |
| 667 | if hasattr(event, 'fn'): | 667 | if hasattr(event, 'fn') and event.levelno not in [bb.msg.BBLogFormatter.WARNONCE, bb.msg.BBLogFormatter.ERRORONCE]: |
| 668 | event.msg = event.fn + ': ' + event.msg | 668 | event.msg = event.fn + ': ' + event.msg |
| 669 | logging.getLogger(event.name).handle(event) | 669 | logging.getLogger(event.name).handle(event) |
| 670 | continue | 670 | continue |
| @@ -875,11 +875,11 @@ def main(server, eventHandler, params, tf = TerminalFilter): | |||
| 875 | for failure in taskfailures: | 875 | for failure in taskfailures: |
| 876 | summary += "\n %s" % failure | 876 | summary += "\n %s" % failure |
| 877 | if warnings: | 877 | if warnings: |
| 878 | summary += pluralise("\nSummary: There was %s WARNING message shown.", | 878 | summary += pluralise("\nSummary: There was %s WARNING message.", |
| 879 | "\nSummary: There were %s WARNING messages shown.", warnings) | 879 | "\nSummary: There were %s WARNING messages.", warnings) |
| 880 | if return_value and errors: | 880 | if return_value and errors: |
| 881 | summary += pluralise("\nSummary: There was %s ERROR message shown, returning a non-zero exit code.", | 881 | summary += pluralise("\nSummary: There was %s ERROR message, returning a non-zero exit code.", |
| 882 | "\nSummary: There were %s ERROR messages shown, returning a non-zero exit code.", errors) | 882 | "\nSummary: There were %s ERROR messages, returning a non-zero exit code.", errors) |
| 883 | if summary and params.options.quiet == 0: | 883 | if summary and params.options.quiet == 0: |
| 884 | print(summary) | 884 | print(summary) |
| 885 | 885 | ||
