From f1b048c5487edcae77ef0afc86ca740c6368b856 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 24 Oct 2019 16:16:21 +0200 Subject: [PATCH] base: add context method to ProxyLogger (#37491) It copies the logger and add contextual informations to the extra dictionary, it overwrites keys from previous calls to context. --- passerelle/base/models.py | 10 +++++++--- tests/test_proxylogger.py | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/passerelle/base/models.py b/passerelle/base/models.py index 5a9b3db5..c0d196a2 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -755,15 +755,18 @@ class ResourceStatus(models.Model): class ProxyLogger(object): - - def __init__(self, connector): + def __init__(self, connector, extra=None): self.connector = connector self.appname = connector.get_connector_slug() self.slug = connector.slug + self.extra = extra or {} logger_name = 'passerelle.resource.%s.%s' % (self.appname, self.slug) self._logger = logging.getLogger(logger_name) self._logger.setLevel(connector.log_level) + def context(self, **kwargs): + return self.__class__(self.connector, extra=dict(self.extra or {}, **kwargs)) + @property def level(self): return self._logger.getEffectiveLevel() @@ -805,7 +808,8 @@ class ProxyLogger(object): attr['appname'] = self.appname attr['slug'] = self.slug - extra = kwargs.get('extra', {}) + extra = (self.extra or {}).copy() + extra.update(kwargs.get('extra', {})) request = extra.get('request') def is_json_serializable(value): diff --git a/tests/test_proxylogger.py b/tests/test_proxylogger.py index b2eb763e..62043ced 100644 --- a/tests/test_proxylogger.py +++ b/tests/test_proxylogger.py @@ -229,3 +229,30 @@ def test_log_on_connector_availability_change(db, connector, freezer, notificati assert last_count4 == last_count3 + 1 assert ResourceLog.objects.latest('id').level == 'info' assert ResourceLog.objects.latest('id').message == 'GET http://example.net/ (=> 200)' + + +def test_proxy_logger_context(db, connector): + base_logger = ProxyLogger(connector) + base_logger.debug('test') + log = ResourceLog.objects.latest('id') + assert log.extra == {} + + context1_logger = base_logger.context(extra1='toto') + context1_logger.debug('test') + log = ResourceLog.objects.latest('id') + assert log.extra == {'extra1': 'toto'} + + # Check extra is updated not overwritten + context2_logger = context1_logger.context(extra2='titi') + context2_logger.debug('test') + log = ResourceLog.objects.latest('id') + assert log.extra == {'extra1': 'toto', 'extra2': 'titi'} + + # Check other logger were not modified + context1_logger.debug('test') + log = ResourceLog.objects.latest('id') + assert log.extra == {'extra1': 'toto'} + + base_logger.debug('test') + log = ResourceLog.objects.latest('id') + assert log.extra == {} -- 2.23.0