cert_audit: Enable logging module

Signed-off-by: Pengyu Lv <pengyu.lv@arm.com>
diff --git a/tests/scripts/audit-validity-dates.py b/tests/scripts/audit-validity-dates.py
index 89a6dd4..4000668 100755
--- a/tests/scripts/audit-validity-dates.py
+++ b/tests/scripts/audit-validity-dates.py
@@ -30,6 +30,7 @@
 import argparse
 import datetime
 import glob
+import logging
 from enum import Enum
 
 # The script requires cryptography >= 35.0.0 which is only available
@@ -168,8 +169,8 @@
 
 class Auditor:
     """A base class for audit."""
-    def __init__(self, verbose):
-        self.verbose = verbose
+    def __init__(self, logger):
+        self.logger = logger
         self.default_files = []
         # A list to store the parsed audit_data.
         self.audit_data = []
@@ -188,14 +189,6 @@
             },
         })
 
-    def error(self, *args):
-        #pylint: disable=no-self-use
-        print("Error: ", *args, file=sys.stderr)
-
-    def warn(self, *args):
-        if self.verbose:
-            print("Warn: ", *args, file=sys.stderr)
-
     def parse_file(self, filename: str) -> typing.List[AuditData]:
         """
         Parse a list of AuditData from file.
@@ -219,7 +212,7 @@
                 result = self.parser[data_type](data)
             except ValueError as val_error:
                 result = None
-                self.warn(val_error)
+                self.logger.warning(val_error)
             if result is not None:
                 audit_data = AuditData(data_type, result)
                 return audit_data
@@ -308,6 +301,39 @@
         audit_data.data_type.name,
         audit_data.location))
 
+
+def configure_logger(logger: logging.Logger) -> None:
+    """
+    Configure the logging.Logger instance so that:
+        - Format is set to "[%(levelname)s]: %(message)s".
+        - loglevel >= WARNING are printed to stderr.
+        - loglevel <  WARNING are printed to stdout.
+    """
+    class MaxLevelFilter(logging.Filter):
+        # pylint: disable=too-few-public-methods
+        def __init__(self, max_level, name=''):
+            super().__init__(name)
+            self.max_level = max_level
+
+        def filter(self, record: logging.LogRecord) -> bool:
+            return record.levelno <= self.max_level
+
+    log_formatter = logging.Formatter("[%(levelname)s]: %(message)s")
+
+    # set loglevel >= WARNING to be printed to stderr
+    stderr_hdlr = logging.StreamHandler(sys.stderr)
+    stderr_hdlr.setLevel(logging.WARNING)
+    stderr_hdlr.setFormatter(log_formatter)
+
+    # set loglevel <= INFO to be printed to stdout
+    stdout_hdlr = logging.StreamHandler(sys.stdout)
+    stdout_hdlr.addFilter(MaxLevelFilter(logging.INFO))
+    stdout_hdlr.setFormatter(log_formatter)
+
+    logger.addHandler(stderr_hdlr)
+    logger.addHandler(stdout_hdlr)
+
+
 def main():
     """
     Perform argument parsing.
@@ -319,7 +345,7 @@
                         help='list the information of all the files')
     parser.add_argument('-v', '--verbose',
                         action='store_true', dest='verbose',
-                        help='show warnings')
+                        help='show logs')
     parser.add_argument('--not-before', dest='not_before',
                         help=('not valid before this date (UTC, YYYY-MM-DD). '
                               'Default: today'),
@@ -334,8 +360,13 @@
     args = parser.parse_args()
 
     # start main routine
-    td_auditor = TestDataAuditor(args.verbose)
-    sd_auditor = SuiteDataAuditor(args.verbose)
+    # setup logger
+    logger = logging.getLogger()
+    configure_logger(logger)
+    logger.setLevel(logging.DEBUG if args.verbose else logging.ERROR)
+
+    td_auditor = TestDataAuditor(logger)
+    sd_auditor = SuiteDataAuditor(logger)
 
     if args.files:
         data_files = args.files
@@ -368,7 +399,7 @@
     for d in filter(filter_func, audit_results):
         list_all(d)
 
-    print("\nDone!\n")
+    logger.debug("Done!")
 
 if __name__ == "__main__":
     main()