Skip to content

Commit 1bbd482

Browse files
authored
bpo-31457: Allow for nested LoggerAdapter objects (#3551)
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.
1 parent 5a61559 commit 1bbd482

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

Lib/logging/__init__.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,6 +1739,27 @@ def hasHandlers(self):
17391739
"""
17401740
return self.logger.hasHandlers()
17411741

1742+
def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
1743+
"""
1744+
Low-level log implementation, proxied to allow nested logger adapters.
1745+
"""
1746+
return self.logger._log(
1747+
level,
1748+
msg,
1749+
args,
1750+
exc_info=exc_info,
1751+
extra=extra,
1752+
stack_info=stack_info,
1753+
)
1754+
1755+
@property
1756+
def manager(self):
1757+
return self.logger.manager
1758+
1759+
@manager.setter
1760+
def set_manager(self, value):
1761+
self.logger.manager = value
1762+
17421763
def __repr__(self):
17431764
logger = self.logger
17441765
level = getLevelName(logger.getEffectiveLevel())

Lib/test/test_logging.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3986,6 +3986,17 @@ def test_has_handlers(self):
39863986
self.assertFalse(self.logger.hasHandlers())
39873987
self.assertFalse(self.adapter.hasHandlers())
39883988

3989+
def test_nested(self):
3990+
msg = 'Adapters can be nested, yo.'
3991+
adapter_adapter = logging.LoggerAdapter(logger=self.adapter, extra=None)
3992+
adapter_adapter.log(logging.CRITICAL, msg, self.recording)
3993+
3994+
self.assertEqual(len(self.recording.records), 1)
3995+
record = self.recording.records[0]
3996+
self.assertEqual(record.levelno, logging.CRITICAL)
3997+
self.assertEqual(record.msg, msg)
3998+
self.assertEqual(record.args, (self.recording,))
3999+
39894000

39904001
class LoggerTest(BaseTest):
39914002

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
LoggerAdapter objects can now be nested.

0 commit comments

Comments
 (0)