From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 19 Oct 2017 18:11:49 +0000 (-0700) Subject: bpo-31457: Don't omit inner ``process()`` calls with nested LogAdapters (GH-4044... X-Git-Tag: v3.6.4rc1~149 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d9a8f22999de489ede9216ff983d4359d837760;p=python bpo-31457: Don't omit inner ``process()`` calls with nested LogAdapters (GH-4044) (GH-4050) This used to be the case on Python 2. Commit 212b590e118e3650b596917021ed9612a918180b changed the implementation for Python 3, making the `log()` method of LogAdapter call `logger._log()` directly. This makes nested log adapters not execute their ``process()`` method. This patch fixes the issue. Also, now proxying `name`, too, to make `repr()` work with nested log adapters. New tests added. (cherry picked from commit ce9e62544571e7ade7186697d5dd065fb4c5243f) --- diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index d363af5a1a..3617dbb6d9 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1669,7 +1669,7 @@ class LoggerAdapter(object): """ if self.isEnabledFor(level): msg, kwargs = self.process(msg, kwargs) - self.logger._log(level, msg, args, **kwargs) + self.logger.log(level, msg, *args, **kwargs) def isEnabledFor(self, level): """ @@ -1718,6 +1718,10 @@ class LoggerAdapter(object): def manager(self, value): self.logger.manager = value + @property + def name(self): + return self.logger.name + 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 f0e2437b28..b325f7697f 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3881,7 +3881,6 @@ class BasicConfigTest(unittest.TestCase): class LoggerAdapterTest(unittest.TestCase): - def setUp(self): super(LoggerAdapterTest, self).setUp() old_handler_list = logging._handlerList[:] @@ -3956,27 +3955,36 @@ class LoggerAdapterTest(unittest.TestCase): self.assertFalse(self.adapter.hasHandlers()) def test_nested(self): + class Adapter(logging.LoggerAdapter): + prefix = 'Adapter' + + def process(self, msg, kwargs): + return f"{self.prefix} {msg}", kwargs + msg = 'Adapters can be nested, yo.' - adapter_adapter = logging.LoggerAdapter(logger=self.adapter, extra=None) + adapter = Adapter(logger=self.logger, extra=None) + adapter_adapter = Adapter(logger=adapter, extra=None) + adapter_adapter.prefix = 'AdapterAdapter' + self.assertEqual(repr(adapter), repr(adapter_adapter)) 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.msg, f"Adapter AdapterAdapter {msg}") self.assertEqual(record.args, (self.recording,)) orig_manager = adapter_adapter.manager - self.assertIs(self.adapter.manager, orig_manager) + self.assertIs(adapter.manager, orig_manager) self.assertIs(self.logger.manager, orig_manager) temp_manager = object() try: adapter_adapter.manager = temp_manager self.assertIs(adapter_adapter.manager, temp_manager) - self.assertIs(self.adapter.manager, temp_manager) + self.assertIs(adapter.manager, temp_manager) self.assertIs(self.logger.manager, temp_manager) finally: adapter_adapter.manager = orig_manager self.assertIs(adapter_adapter.manager, orig_manager) - self.assertIs(self.adapter.manager, orig_manager) + self.assertIs(adapter.manager, orig_manager) self.assertIs(self.logger.manager, orig_manager) diff --git a/Misc/NEWS.d/next/Library/2017-10-18-19-05-17.bpo-31457.KlE6r8.rst b/Misc/NEWS.d/next/Library/2017-10-18-19-05-17.bpo-31457.KlE6r8.rst new file mode 100644 index 0000000000..49463c4fd1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-10-18-19-05-17.bpo-31457.KlE6r8.rst @@ -0,0 +1,2 @@ +If nested log adapters are used, the inner ``process()`` methods are no +longer omitted.