[4/5] msg: Add bb.erroronce() to logging

Message ID 20220216113158.2899964-4-richard.purdie@linuxfoundation.org
State New
Headers show
Series [1/5] data_smart: Fix overrides file/line message additions | expand

Commit Message

Richard Purdie Feb. 16, 2022, 11:31 a.m. UTC
Similar to the warnonce addition in the previous commit, add a similarly
behaving version for error messages.

Tweak the log filter further rather than adding an additional one.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 lib/bb/__init__.py  |  7 +++++++
 lib/bb/msg.py       | 10 +++++++++-
 lib/bb/ui/knotty.py | 20 ++++++++++----------
 3 files changed, 26 insertions(+), 11 deletions(-)

Patch

diff --git a/lib/bb/__init__.py b/lib/bb/__init__.py
index 4b6ad5cbc8..269f65edce 100644
--- a/lib/bb/__init__.py
+++ b/lib/bb/__init__.py
@@ -74,6 +74,10 @@  class BBLoggerMixin(object):
     def warnonce(self, msg, *args, **kwargs):
         return self.log(logging.WARNING - 1, msg, *args, **kwargs)
 
+    def erroronce(self, msg, *args, **kwargs):
+        return self.log(logging.ERROR - 1, msg, *args, **kwargs)
+
+
 Logger = logging.getLoggerClass()
 class BBLogger(Logger, BBLoggerMixin):
     def __init__(self, name, *args, **kwargs):
@@ -166,6 +170,9 @@  def warnonce(*args):
 def error(*args, **kwargs):
     mainlogger.error(''.join(args), extra=kwargs)
 
+def erroronce(*args):
+    mainlogger.erroronce(''.join(args))
+
 def fatal(*args, **kwargs):
     mainlogger.critical(''.join(args), extra=kwargs)
     raise BBHandledException()
diff --git a/lib/bb/msg.py b/lib/bb/msg.py
index ae079c4596..c2bd8aaf40 100644
--- a/lib/bb/msg.py
+++ b/lib/bb/msg.py
@@ -30,6 +30,7 @@  class BBLogFormatter(logging.Formatter):
     PLAIN = logging.INFO + 1
     VERBNOTE = logging.INFO + 2
     ERROR = logging.ERROR
+    ERRORONCE = logging.ERROR - 1
     WARNING = logging.WARNING
     WARNONCE = logging.WARNING - 1
     CRITICAL = logging.CRITICAL
@@ -45,6 +46,7 @@  class BBLogFormatter(logging.Formatter):
         WARNING : 'WARNING',
         WARNONCE : 'WARNING',
         ERROR   : 'ERROR',
+        ERRORONCE   : 'ERROR',
         CRITICAL: 'ERROR',
     }
 
@@ -62,6 +64,7 @@  class BBLogFormatter(logging.Formatter):
         WARNING : YELLOW,
         WARNONCE : YELLOW,
         ERROR   : RED,
+        ERRORONCE : RED,
         CRITICAL: RED,
     }
 
@@ -124,9 +127,10 @@  class BBLogFilter(object):
             return True
         return False
 
-class LogFilterWarnOnce(logging.Filter):
+class LogFilterShowOnce(logging.Filter):
     def __init__(self):
         self.seen_warnings = set()
+        self.seen_errors = set()
 
     def filter(self, record):
         msg = record.msg
@@ -134,6 +138,10 @@  class LogFilterWarnOnce(logging.Filter):
             if record.msg in self.seen_warnings:
                 return False
             self.seen_warnings.add(record.msg)
+        if record.levelno == bb.msg.BBLogFormatter.ERRORONCE:
+            if record.msg in self.seen_errors:
+                return False
+            self.seen_errors.add(record.msg)
         return True
 
 class LogFilterGEQLevel(logging.Filter):
diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
index 1c46ec843b..93eb4b56cb 100644
--- a/lib/bb/ui/knotty.py
+++ b/lib/bb/ui/knotty.py
@@ -418,7 +418,7 @@  def main(server, eventHandler, params, tf = TerminalFilter):
                 "formatter": "BitBake.consoleFormatter",
                 "level": console_loglevel,
                 "stream": "ext://sys.stdout",
-                "filters": ["BitBake.warnonceFilter", "BitBake.stdoutFilter"],
+                "filters": ["BitBake.showonceFilter", "BitBake.stdoutFilter"],
                 ".": {
                     "is_console": True,
                 },
@@ -428,7 +428,7 @@  def main(server, eventHandler, params, tf = TerminalFilter):
                 "formatter": "BitBake.consoleFormatter",
                 "level": loglevel,
                 "stream": "ext://sys.stderr",
-                "filters": ["BitBake.warnonceFilter", "BitBake.stderrFilter"],
+                "filters": ["BitBake.showonceFilter", "BitBake.stderrFilter"],
                 ".": {
                     "is_console": True,
                 },
@@ -443,7 +443,7 @@  def main(server, eventHandler, params, tf = TerminalFilter):
                 "formatter": "BitBake.consoleFormatter",
                 "level": 1,
                 "stream": "ext://sys.stdout",
-                "filters": ["BitBake.warnonceFilter", "BitBake.verbconsoleFilter"],
+                "filters": ["BitBake.showonceFilter", "BitBake.verbconsoleFilter"],
                 ".": {
                     "is_console": True,
                 },
@@ -476,8 +476,8 @@  def main(server, eventHandler, params, tf = TerminalFilter):
                 "()": "bb.msg.LogFilterLTLevel",
                 "level": console_loglevel
             },
-            "BitBake.warnonceFilter": {
-                "()": "bb.msg.LogFilterWarnOnce",
+            "BitBake.showonceFilter": {
+                "()": "bb.msg.LogFilterShowOnce",
             },
         },
         "loggers": {
@@ -650,7 +650,7 @@  def main(server, eventHandler, params, tf = TerminalFilter):
             if isinstance(event, logging.LogRecord):
                 lastprint = time.time()
                 printinterval = 5000
-                if event.levelno >= bb.msg.BBLogFormatter.ERROR:
+                if event.levelno >= bb.msg.BBLogFormatter.ERRORONCE:
                     errors = errors + 1
                     return_value = 1
                 elif event.levelno == bb.msg.BBLogFormatter.WARNING:
@@ -664,10 +664,10 @@  def main(server, eventHandler, params, tf = TerminalFilter):
                         continue
 
                     # Prefix task messages with recipe/task
-                    if event.taskpid in helper.pidmap and event.levelno != bb.msg.BBLogFormatter.PLAIN and event.levelno != bb.msg.BBLogFormatter.WARNONCE:
+                    if event.taskpid in helper.pidmap and event.levelno not in [bb.msg.BBLogFormatter.PLAIN, bb.msg.BBLogFormatter.WARNONCE, bb.msg.BBLogFormatter.ERRORONCE]:
                         taskinfo = helper.running_tasks[helper.pidmap[event.taskpid]]
                         event.msg = taskinfo['title'] + ': ' + event.msg
-                if hasattr(event, 'fn') and event.levelno != bb.msg.BBLogFormatter.WARNONCE:
+                if hasattr(event, 'fn') and event.levelno not in [bb.msg.BBLogFormatter.WARNONCE, bb.msg.BBLogFormatter.ERRORONCE]:
                     event.msg = event.fn + ': ' + event.msg
                 logging.getLogger(event.name).handle(event)
                 continue
@@ -881,8 +881,8 @@  def main(server, eventHandler, params, tf = TerminalFilter):
             summary += pluralise("\nSummary: There was %s WARNING message.",
                                  "\nSummary: There were %s WARNING messages.", warnings)
         if return_value and errors:
-            summary += pluralise("\nSummary: There was %s ERROR message shown, returning a non-zero exit code.",
-                                 "\nSummary: There were %s ERROR messages shown, returning a non-zero exit code.", errors)
+            summary += pluralise("\nSummary: There was %s ERROR message, returning a non-zero exit code.",
+                                 "\nSummary: There were %s ERROR messages, returning a non-zero exit code.", errors)
         if summary and params.options.quiet == 0:
             print(summary)