diff --git a/library/python/pysandesh/sandesh_base.py b/library/python/pysandesh/sandesh_base.py index 5849ee3b..60d694ce 100644 --- a/library/python/pysandesh/sandesh_base.py +++ b/library/python/pysandesh/sandesh_base.py @@ -10,7 +10,9 @@ import gevent import pkgutil import importlib +import sandesh_logger import trace + from work_queue import WorkQueue from sandesh_logger import SandeshLogger from sandesh_client import SandeshClient @@ -60,7 +62,8 @@ def __init__(self): def init_generator(self, module, source, node_type, instance_id, collectors, client_context, http_port, sandesh_req_uve_pkg_list=None, - discovery_client=None, connect_to_collector=True): + discovery_client=None, connect_to_collector=True, + logger_class=None, logger_config_file=None): self._role = self.SandeshRole.GENERATOR self._module = module self._source = source @@ -70,8 +73,8 @@ def init_generator(self, module, source, node_type, instance_id, self._collectors = collectors self._connect_to_collector = connect_to_collector self._rcv_queue = WorkQueue(self._process_rx_sandesh) - self._init_logger(source + ':' + module + ':' + node_type + ':' \ - + instance_id) + self._init_logger(module, logger_class=logger_class, + logger_config_file=logger_config_file) self._logger.info('SANDESH: CONNECT TO COLLECTOR: %s', connect_to_collector) self._stats = SandeshStats() @@ -324,8 +327,8 @@ def send_sandesh(self, tx_sandesh): self._logger.error('SANDESH: No Client: %s', tx_sandesh.log()) else: self._logger.log( - SandeshLogger.get_py_logger_level(tx_sandesh.level()), - tx_sandesh.log()) + sandesh_logger.SandeshBaseLogger.get_py_logger_level( + tx_sandesh.level()), tx_sandesh.log()) # end send_sandesh def send_generator_info(self): @@ -613,10 +616,13 @@ def _add_sandesh_alarm(self, mod): alarm_data_type_name, mod) # end _add_sandesh_alarm - def _init_logger(self, generator): + def _init_logger(self, generator, logger_class=None, + logger_config_file=None): if not generator: generator = 'sandesh' - self._sandesh_logger = SandeshLogger(generator) + self._sandesh_logger = sandesh_logger.SandeshBaseLogger.create_logger( + generator, logger_class=logger_class, + logger_config_file=logger_config_file) self._logger = self._sandesh_logger.logger() # end _init_logger diff --git a/library/python/pysandesh/sandesh_logger.py b/library/python/pysandesh/sandesh_logger.py index 81feb966..18e09f25 100644 --- a/library/python/pysandesh/sandesh_logger.py +++ b/library/python/pysandesh/sandesh_logger.py @@ -6,17 +6,17 @@ # Sandesh Logger # +from cfgm_common import importutils + import logging import logging.handlers from gen_py.sandesh.ttypes import SandeshLevel -class SandeshLogger(object): - """Sandesh Logger Implementation.""" +class SandeshBaseLogger(object): + """Sandesh Base Logger""" _logger = None - _DEFAULT_LOG_FILE = '' - _DEFAULT_SYSLOG_FACILITY = 'LOG_LOCAL0' _SANDESH_LEVEL_TO_LOGGER_LEVEL = { SandeshLevel.SYS_EMERG : logging.CRITICAL, @@ -28,8 +28,57 @@ class SandeshLogger(object): SandeshLevel.SYS_INFO : logging.INFO, SandeshLevel.SYS_DEBUG : logging.DEBUG } + + def __init__(self, generator, logger_config_file=None): + pass + + @staticmethod + def create_logger(generator, logger_class=None, + logger_config_file=None): + if logger_class and logger_config_file: + try: + l_class = importutils.import_class(logger_class) + return l_class(generator, + logger_config_file=logger_config_file) + except Exception: + # if there is any exception use the default SandeshLogger + pass + + return SandeshLogger(generator, logger_config_file=logger_config_file) + + @staticmethod + def get_py_logger_level(sandesh_level): + return SandeshLogger._SANDESH_LEVEL_TO_LOGGER_LEVEL[sandesh_level] + #end get_py_logger_level + + def logger(self): + return self._logger + + def set_logging_params(self, **kwargs): + pass - def __init__(self, generator): + +class SandeshConfigLogger(SandeshBaseLogger): + + " Sandesh Config Logger Implementation" + + def __init__(self, generator, logger_config_file=None): + self._generator = generator + self._logger_config_file = logger_config_file + if not self._logger_config_file: + return + + logging.config.fileConfig(logger_config_file) + self._logger = logging.getLogger(self._generator) + + +class SandeshLogger(SandeshBaseLogger): + + """Sandesh Logger Implementation.""" + _DEFAULT_LOG_FILE = '' + _DEFAULT_SYSLOG_FACILITY = 'LOG_LOCAL0' + + def __init__(self, generator, logger_config_file=None): assert generator, 'SandeshLogger init requires generator name' self._generator = generator @@ -38,9 +87,14 @@ def __init__(self, generator): self._logging_category = '' self._logging_file = self._DEFAULT_LOG_FILE self._logging_syslog_facility = self._DEFAULT_SYSLOG_FACILITY - self._logger = logging.getLogger(self._generator) self._logging_level = SandeshLevel.SYS_INFO - self._logger.setLevel(SandeshLogger.get_py_logger_level(self._logging_level)) + + if logger_config_file: + logging.config.fileConfig(logger_config_file) + + self._logger = logging.getLogger(self._generator) + self._logger.setLevel(SandeshBaseLogger.get_py_logger_level( + self._logging_level)) if not len(self._logger.handlers): # add the handler only once self._logging_file_handler = logging.StreamHandler() @@ -50,17 +104,9 @@ def __init__(self, generator): self._logger.addHandler(self._logging_file_handler) else: self._logging_file_handler = self._logger.handlers[0] + #end __init__ - @staticmethod - def get_py_logger_level(sandesh_level): - return SandeshLogger._SANDESH_LEVEL_TO_LOGGER_LEVEL[sandesh_level] - #end get_py_logger_level - - def logger(self): - return self._logger - #end logger - def set_logging_params(self, enable_local_log=False, category='', level=SandeshLevel.SYS_INFO, file=_DEFAULT_LOG_FILE, enable_syslog=False, syslog_facility='LOG_LOCAL0'): self.set_local_logging(enable_local_log)