From 5589c27a67c052716f726c3ecded084e1f47d97f Mon Sep 17 00:00:00 2001 From: Anuj Mathur Date: Fri, 5 Jul 2013 12:41:23 +0530 Subject: [PATCH] Created exchange logger which appends the name of the exchange to the logs --- stacktach/stacklog.py | 63 +++++++++++++++++----- tests/unit/test_stacklog.py | 102 ++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+), 13 deletions(-) create mode 100644 tests/unit/test_stacklog.py diff --git a/stacktach/stacklog.py b/stacktach/stacklog.py index bf142ae..28344ba 100644 --- a/stacktach/stacklog.py +++ b/stacktach/stacklog.py @@ -36,31 +36,33 @@ def set_default_logger_name(name): default_logger_name = name -def _make_logger(name): - log = logging.getLogger(__name__) - log.setLevel(logging.DEBUG) - handler = logging.handlers.TimedRotatingFileHandler(default_logger_location % name, - when='midnight', interval=1, backupCount=3) - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - handler.setFormatter(formatter) - log.addHandler(handler) - log.handlers[0].doRollover() +def _logger_factory(exchange, name): + if exchange: + return ExchangeLogger(exchange, name) + else: + logger = logging.getLogger(__name__) + _configure(logger, name) + return logger + + +def _make_logger(name, exchange=None): + log = _logger_factory(exchange, name) return log -def init_logger(name=None): +def init_logger(name=None, exchange=None): global LOGGERS if name is None: name = default_logger_name if name not in LOGGERS: - LOGGERS[name] = _make_logger(name) + LOGGERS[name] = _make_logger(name, exchange) -def get_logger(name=None): +def get_logger(name=None, exchange=None): global LOGGERS if name is None: name = default_logger_name - init_logger(name=name) + init_logger(name=name, exchange=exchange) return LOGGERS[name] @@ -80,3 +82,38 @@ def info(msg, name=None): if name is None: name = default_logger_name get_logger(name=name).info(msg) + + +def _configure(logger, name): + logger.setLevel(logging.DEBUG) + handler = logging.handlers.TimedRotatingFileHandler( + default_logger_location % name, + when='midnight', interval=1, backupCount=3) + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s') + handler.setFormatter(formatter) + logger.addHandler(handler) + logger.handlers[0].doRollover() + + +class ExchangeLogger(): + def __init__(self, exchange, name='stacktach-default'): + self.logger = logging.getLogger(name) + _configure(self.logger, name) + self.exchange = exchange + + def info(self, msg, *args, **kwargs): + msg = self.exchange + ': ' + msg + self.logger.info(msg, *args, **kwargs) + + def warn(self, msg, *args, **kwargs): + msg = self.exchange + ': ' + msg + self.logger.warn(msg, *args, **kwargs) + + def error(self, msg, *args, **kwargs): + msg = self.exchange + ': ' + msg + self.logger.error(msg, *args, **kwargs) + + def exception(self, msg, *args, **kwargs): + msg = self.exchange + ': ' + msg + self.logger.error(msg, *args, **kwargs) \ No newline at end of file diff --git a/tests/unit/test_stacklog.py b/tests/unit/test_stacklog.py new file mode 100644 index 0000000..d121953 --- /dev/null +++ b/tests/unit/test_stacklog.py @@ -0,0 +1,102 @@ +import glob +import logging +import os +from unittest import TestCase +import mox +from stacktach import stacklog +import __builtin__ +from stacktach.stacklog import ExchangeLogger + + +class StacklogTestCase(TestCase): + def setUp(self): + self.mox = mox.Mox() + + def tearDown(self): + self.mox.UnsetStubs() + + def test_get_logger_should_get_exchange_logger_if_exchange_provided(self): + filename = 'filename' + logger = stacklog.get_logger(filename, 'nova') + self.assertIsInstance(logger, ExchangeLogger) + for file in glob.glob('{0}.log*'.format(filename)): + os.remove(file) + + def test_get_logger_should_get_default_logger_if_exchange_not_provided(self): + filename = 'default_logger' + logger = stacklog.get_logger(filename) + self.assertIsInstance(logger, logging.Logger) + for file in glob.glob('{0}.log*'.format(filename)): + os.remove(file) + + +class ExchangeLoggerTestCase(TestCase): + def setUp(self): + self.mox = mox.Mox() + + def tearDown(self): + self.mox.UnsetStubs() + + def _setup_logger_mocks(self, name='name'): + mock_logger = self.mox.CreateMockAnything() + self.mox.StubOutWithMock(logging, 'getLogger') + logging.getLogger(name).AndReturn(mock_logger) + mock_logger.setLevel(logging.DEBUG) + self.mox.StubOutClassWithMocks(logging.handlers, + 'TimedRotatingFileHandler') + filename = "{0}.log".format(name) + handler = logging.handlers.TimedRotatingFileHandler( + filename, backupCount=3, interval=1, when='midnight') + self.mox.StubOutClassWithMocks(logging, 'Formatter') + mock_formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s") + handler.setFormatter(mock_formatter) + mock_logger.addHandler(handler) + mock_logger.handlers = [handler] + handler.doRollover() + return mock_logger + + def test_exchange_logger_should_append_exchange_name_to_info(self): + mock_logger = self._setup_logger_mocks() + mock_logger.info('exchange: Log %s', 'args', xyz='xyz') + self.mox.ReplayAll() + + log = ExchangeLogger('exchange', 'name') + log.info("Log %s", 'args', xyz='xyz') + self.mox.VerifyAll() + + def test_exchange_logger_should_append_exchange_name_to_warn(self): + mock_logger = self._setup_logger_mocks() + mock_logger.warn('exchange: Log %s', 'args', xyz='xyz') + self.mox.ReplayAll() + + logger = ExchangeLogger('exchange', 'name') + logger.warn("Log %s", 'args', xyz='xyz') + self.mox.VerifyAll() + + def test_exchange_logger_should_append_exchange_name_to_error(self): + mock_logger = self._setup_logger_mocks() + mock_logger.error('exchange: Log %s', 'args', xyz='xyz') + self.mox.ReplayAll() + + logger = ExchangeLogger('exchange', 'name') + logger.error("Log %s", 'args', xyz='xyz') + self.mox.VerifyAll() + + def test_exchange_logger_should_append_exchange_name_to_exception(self): + mock_logger = self._setup_logger_mocks() + mock_logger.error('exchange: Log %s', 'args', xyz='xyz') + self.mox.ReplayAll() + + logger = ExchangeLogger('exchange', 'name') + logger.exception("Log %s", 'args', xyz='xyz') + self.mox.VerifyAll() + + def test_exchange_logger_should_use_default_name_if_not_provided(self): + self._setup_logger_mocks('stacktach-default') + self.mox.ReplayAll() + + ExchangeLogger('exchange') + self.mox.VerifyAll() + +