From 77ebccacf4fa0bd3b6503f31fc3785cac9f4efdb Mon Sep 17 00:00:00 2001 From: Rafael Zalamena Date: Fri, 7 Jul 2017 09:29:41 -0300 Subject: [PATCH] topolog: support adding loggers during runtime 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 | 40 +++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/tests/topotests/lib/topolog.py b/tests/topotests/lib/topolog.py index 0a192ce285..3a383c8e73 100644 --- a/tests/topotests/lib/topolog.py +++ b/tests/topotests/lib/topolog.py @@ -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 -- 2.39.5