]> git.puffer.fish Git - matthieu/frr.git/commitdiff
topolog: support adding loggers during runtime
authorRafael Zalamena <rzalamena@gmail.com>
Fri, 7 Jul 2017 12:29:41 +0000 (09:29 -0300)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 28 Nov 2018 01:22:11 +0000 (20:22 -0500)
Allow topotest subsystems to create their own loggers. This will help
increase log organization and allow different settings to fit the
subsystems needs.

tests/topotests/lib/topolog.py

index 0a192ce2857e5f8f478e82093630b0bb554ed6d4..3a383c8e732265601a25b1143b31551f6e56561d 100644 (file)
@@ -26,6 +26,7 @@ Logging utilities for topology tests.
 This file defines our logging abstraction.
 """
 
+import sys
 import logging
 
 # Helper dictionary to convert Topogen logging levels to Python's logging.
@@ -51,16 +52,45 @@ class Logger(object):
     """
 
     def __init__(self):
-        self.logger = logging.Logger('topolog', level=logging.INFO)
-        self.handler = logging.StreamHandler()
-        self.handler.setFormatter(
+        # Create default global logger
+        self.log_level = logging.INFO
+        self.logger = logging.Logger('topolog', level=self.log_level)
+        handler = logging.StreamHandler()
+        handler.setFormatter(
             logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s')
         )
-        self.logger.addHandler(self.handler)
+        self.logger.addHandler(handler)
+
+        # Handle more loggers
+        self.loggers = {'topolog': self.logger}
 
     def set_log_level(self, level):
         "Set the logging level"
-        self.logger.setLevel(DEBUG_TOPO2LOGGING.get(level))
+        self.log_level = DEBUG_TOPO2LOGGING.get(level)
+        self.logger.setLevel(self.log_level)
+
+    def get_logger(self, name='topolog', log_level=None, target=sys.stdout):
+        """
+        Get a new logger entry. Allows creating different loggers for formating,
+        filtering or handling (file, stream or stdout/stderr).
+        """
+        if log_level is None:
+            log_level = self.log_level
+        if self.loggers.has_key(name):
+            return self.loggers[name]
+
+        nlogger = logging.Logger(name, level=log_level)
+        if isinstance(target, str):
+            handler = logging.FileHandler(filename=target)
+        else:
+            handler = logging.StreamHandler(stream=target)
+
+        handler.setFormatter(
+            logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s')
+        )
+        nlogger.addHandler(handler)
+        self.loggers[name] = nlogger
+        return nlogger
 
 #
 # Global variables