diff options
Diffstat (limited to 'bitbake/lib/bb/msg.py')
-rw-r--r-- | bitbake/lib/bb/msg.py | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index 291b38ff7f..3e18596faa 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,22 @@ 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 | if record.levelno == bb.msg.BBLogFormatter.WARNONCE: | ||
137 | if record.msg in self.seen_warnings: | ||
138 | return False | ||
139 | self.seen_warnings.add(record.msg) | ||
140 | if record.levelno == bb.msg.BBLogFormatter.ERRORONCE: | ||
141 | if record.msg in self.seen_errors: | ||
142 | return False | ||
143 | self.seen_errors.add(record.msg) | ||
144 | return True | ||
145 | |||
124 | class LogFilterGEQLevel(logging.Filter): | 146 | class LogFilterGEQLevel(logging.Filter): |
125 | def __init__(self, level): | 147 | def __init__(self, level): |
126 | self.strlevel = str(level) | 148 | self.strlevel = str(level) |
@@ -206,8 +228,9 @@ def logger_create(name, output=sys.stderr, level=logging.INFO, preserve_handlers | |||
206 | """Standalone logger creation function""" | 228 | """Standalone logger creation function""" |
207 | logger = logging.getLogger(name) | 229 | logger = logging.getLogger(name) |
208 | console = logging.StreamHandler(output) | 230 | console = logging.StreamHandler(output) |
231 | console.addFilter(bb.msg.LogFilterShowOnce()) | ||
209 | format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | 232 | format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") |
210 | if color == 'always' or (color == 'auto' and output.isatty()): | 233 | if color == 'always' or (color == 'auto' and output.isatty() and os.environ.get('NO_COLOR', '') == ''): |
211 | format.enable_color() | 234 | format.enable_color() |
212 | console.setFormatter(format) | 235 | console.setFormatter(format) |
213 | if preserve_handlers: | 236 | if preserve_handlers: |
@@ -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"]) |