]> granicus.if.org Git - python/commitdiff
[3.6] bpo-31457: Allow for nested LoggerAdapter objects (GH-3551) (#3576)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 14 Sep 2017 17:10:25 +0000 (10:10 -0700)
committerŁukasz Langa <lukasz@langa.pl>
Thu, 14 Sep 2017 17:10:25 +0000 (13:10 -0400)
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.
(cherry picked from commit 1bbd482bcf6ea36bfe488f868810ffe110238ae1)

Lib/logging/__init__.py
Lib/test/test_logging.py
Misc/NEWS.d/next/Library/2017-09-13-13-33-39.bpo-31457.bIVBtI.rst [new file with mode: 0644]

index b44a3b22288ceeb6952e1fe57385bc9dfad64dc7..0965536797d7c6207106ad1b0b4b18cccf374e9e 100644 (file)
@@ -1697,6 +1697,27 @@ class LoggerAdapter(object):
         """
         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())
index 4ec02e10093ecf5b79097cadd0df481af8e6ed9a..25046c3c38ab3e198bcb74ca854b3a267c4b0a01 100644 (file)
@@ -3955,6 +3955,17 @@ class LoggerAdapterTest(unittest.TestCase):
         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 (file)
index 0000000..153aa42
--- /dev/null
@@ -0,0 +1 @@
+LoggerAdapter objects can now be nested.