[Python-checkins] bpo-31457: Don't omit inner ``process()`` calls with nested LogAdapters (GH-4044) (GH-4050)

Mariatta webhook-mailer at python.org
Thu Oct 19 14:11:52 EDT 2017


https://github.com/python/cpython/commit/4d9a8f22999de489ede9216ff983d4359d837760
commit: 4d9a8f22999de489ede9216ff983d4359d837760
branch: 3.6
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Mariatta <Mariatta at users.noreply.github.com>
date: 2017-10-19T11:11:49-07:00
summary:

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)

files:
A Misc/NEWS.d/next/Library/2017-10-18-19-05-17.bpo-31457.KlE6r8.rst
M Lib/logging/__init__.py
M Lib/test/test_logging.py

diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index d363af5a1a8..3617dbb6d99 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -1669,7 +1669,7 @@ def log(self, level, msg, *args, **kwargs):
         """
         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 @@ def manager(self):
     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 f0e2437b285..b325f7697f7 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -3881,7 +3881,6 @@ def test_critical(self):
 
 
 class LoggerAdapterTest(unittest.TestCase):
-
     def setUp(self):
         super(LoggerAdapterTest, self).setUp()
         old_handler_list = logging._handlerList[:]
@@ -3956,27 +3955,36 @@ def test_has_handlers(self):
         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 00000000000..49463c4fd15
--- /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.



More information about the Python-checkins mailing list