This file defines our logging abstraction.
"""
+import sys
import logging
# Helper dictionary to convert Topogen logging levels to Python's logging.
"""
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