diff options
Diffstat (limited to 'bitbake/lib/bb/msg.py')
| -rw-r--r-- | bitbake/lib/bb/msg.py | 32 |
1 files changed, 31 insertions, 1 deletions
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"]) |
