Skip to content

Commit fee0475

Browse files
ambvmiss-islington
authored andcommitted
bpo-31457: Don't omit inner process() calls with nested LogAdapters (GH-4044)
This used to be the case on Python 2. Commit 212b590 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 ce9e625)
1 parent 537ed75 commit fee0475

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

Lib/logging/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1669,7 +1669,7 @@ def log(self, level, msg, *args, **kwargs):
16691669
"""
16701670
if self.isEnabledFor(level):
16711671
msg, kwargs = self.process(msg, kwargs)
1672-
self.logger._log(level, msg, args, **kwargs)
1672+
self.logger.log(level, msg, *args, **kwargs)
16731673

16741674
def isEnabledFor(self, level):
16751675
"""
@@ -1718,6 +1718,10 @@ def manager(self):
17181718
def manager(self, value):
17191719
self.logger.manager = value
17201720

1721+
@property
1722+
def name(self):
1723+
return self.logger.name
1724+
17211725
def __repr__(self):
17221726
logger = self.logger
17231727
level = getLevelName(logger.getEffectiveLevel())

Lib/test/test_logging.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3881,7 +3881,6 @@ def test_critical(self):
38813881

38823882

38833883
class LoggerAdapterTest(unittest.TestCase):
3884-
38853884
def setUp(self):
38863885
super(LoggerAdapterTest, self).setUp()
38873886
old_handler_list = logging._handlerList[:]
@@ -3956,27 +3955,36 @@ def test_has_handlers(self):
39563955
self.assertFalse(self.adapter.hasHandlers())
39573956

39583957
def test_nested(self):
3958+
class Adapter(logging.LoggerAdapter):
3959+
prefix = 'Adapter'
3960+
3961+
def process(self, msg, kwargs):
3962+
return f"{self.prefix} {msg}", kwargs
3963+
39593964
msg = 'Adapters can be nested, yo.'
3960-
adapter_adapter = logging.LoggerAdapter(logger=self.adapter, extra=None)
3965+
adapter = Adapter(logger=self.logger, extra=None)
3966+
adapter_adapter = Adapter(logger=adapter, extra=None)
3967+
adapter_adapter.prefix = 'AdapterAdapter'
3968+
self.assertEqual(repr(adapter), repr(adapter_adapter))
39613969
adapter_adapter.log(logging.CRITICAL, msg, self.recording)
39623970
self.assertEqual(len(self.recording.records), 1)
39633971
record = self.recording.records[0]
39643972
self.assertEqual(record.levelno, logging.CRITICAL)
3965-
self.assertEqual(record.msg, msg)
3973+
self.assertEqual(record.msg, f"Adapter AdapterAdapter {msg}")
39663974
self.assertEqual(record.args, (self.recording,))
39673975
orig_manager = adapter_adapter.manager
3968-
self.assertIs(self.adapter.manager, orig_manager)
3976+
self.assertIs(adapter.manager, orig_manager)
39693977
self.assertIs(self.logger.manager, orig_manager)
39703978
temp_manager = object()
39713979
try:
39723980
adapter_adapter.manager = temp_manager
39733981
self.assertIs(adapter_adapter.manager, temp_manager)
3974-
self.assertIs(self.adapter.manager, temp_manager)
3982+
self.assertIs(adapter.manager, temp_manager)
39753983
self.assertIs(self.logger.manager, temp_manager)
39763984
finally:
39773985
adapter_adapter.manager = orig_manager
39783986
self.assertIs(adapter_adapter.manager, orig_manager)
3979-
self.assertIs(self.adapter.manager, orig_manager)
3987+
self.assertIs(adapter.manager, orig_manager)
39803988
self.assertIs(self.logger.manager, orig_manager)
39813989

39823990

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
If nested log adapters are used, the inner ``process()`` methods are no
2+
longer omitted.

0 commit comments

Comments
 (0)