diff options
Diffstat (limited to 'bitbake/lib')
-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 | ||