From cf2a4f96d68201e1ab9602eeaa6eff44cbae50c9 Mon Sep 17 00:00:00 2001 From: Lukasz Langa Date: Wed, 13 Sep 2017 13:32:02 -0700 Subject: [PATCH] bpo-31457: Allow for nested LoggerAdapter objects Some of the proxied methods use internal Logger state which isn't proxied, causing failures if an adapter is applied to another adapter. This commit fixes the issue, adds a new test for the use case. --- Lib/logging/__init__.py | 21 +++++++++++++++++++ Lib/test/test_logging.py | 11 ++++++++++ .../2017-09-13-13-33-39.bpo-31457.bIVBtI.rst | 1 + 3 files changed, 33 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2017-09-13-13-33-39.bpo-31457.bIVBtI.rst diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 19b96b813cfa7b..b941eab97d6b0c 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1739,6 +1739,27 @@ def hasHandlers(self): """ return self.logger.hasHandlers() + def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False): + """ + Low-level log implementation, proxied to allow nested logger adapters. + """ + return self.logger._log( + level, + msg, + args, + exc_info=exc_info, + extra=extra, + stack_info=stack_info, + ) + + @property + def manager(self): + return self.logger.manager + + @manager.setter + def set_manager(self, value): + self.logger.manager = value + def __repr__(self): logger = self.logger level = getLevelName(logger.getEffectiveLevel()) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 76f98bb572d6e6..611044d8fa823a 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3986,6 +3986,17 @@ def test_has_handlers(self): self.assertFalse(self.logger.hasHandlers()) self.assertFalse(self.adapter.hasHandlers()) + def test_nested(self): + msg = 'Adapters can be nested, yo.' + adapter_adapter = logging.LoggerAdapter(logger=self.adapter, extra=None) + adapter_adapter.log(logging.CRITICAL, msg, self.recording) + + self.assertEqual(len(self.recording.records), 1) + record = self.recording.records[0] + self.assertEqual(record.levelno, logging.CRITICAL) + self.assertEqual(record.msg, msg) + self.assertEqual(record.args, (self.recording,)) + class LoggerTest(BaseTest): diff --git a/Misc/NEWS.d/next/Library/2017-09-13-13-33-39.bpo-31457.bIVBtI.rst b/Misc/NEWS.d/next/Library/2017-09-13-13-33-39.bpo-31457.bIVBtI.rst new file mode 100644 index 00000000000000..153aa42a62e75b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-13-13-33-39.bpo-31457.bIVBtI.rst @@ -0,0 +1 @@ +LoggerAdapter objects can now be nested.