Skip to content

Commit 20fa05d

Browse files
miss-islingtonambv
authored andcommitted
[3.6] bpo-31457: Allow for nested LoggerAdapter objects (GH-3551) (#3576)
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 1bbd482)
1 parent c8b6506 commit 20fa05d

3 files changed

Lines changed: 33 additions & 0 deletions

File tree

Lib/logging/__init__.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,27 @@ def hasHandlers(self):
16971697
"""
16981698
return self.logger.hasHandlers()
16991699

1700+
def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
1701+
"""
1702+
Low-level log implementation, proxied to allow nested logger adapters.
1703+
"""
1704+
return self.logger._log(
1705+
level,
1706+
msg,
1707+
args,
1708+
exc_info=exc_info,
1709+
extra=extra,
1710+
stack_info=stack_info,
1711+
)
1712+
1713+
@property
1714+
def manager(self):
1715+
return self.logger.manager
1716+
1717+
@manager.setter
1718+
def set_manager(self, value):
1719+
self.logger.manager = value
1720+
17001721
def __repr__(self):
17011722
logger = self.logger
17021723
level = getLevelName(logger.getEffectiveLevel())

Lib/test/test_logging.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3955,6 +3955,17 @@ def test_has_handlers(self):
39553955
self.assertFalse(self.logger.hasHandlers())
39563956
self.assertFalse(self.adapter.hasHandlers())
39573957

3958+
def test_nested(self):
3959+
msg = 'Adapters can be nested, yo.'
3960+
adapter_adapter = logging.LoggerAdapter(logger=self.adapter, extra=None)
3961+
adapter_adapter.log(logging.CRITICAL, msg, self.recording)
3962+
3963+
self.assertEqual(len(self.recording.records), 1)
3964+
record = self.recording.records[0]
3965+
self.assertEqual(record.levelno, logging.CRITICAL)
3966+
self.assertEqual(record.msg, msg)
3967+
self.assertEqual(record.args, (self.recording,))
3968+
39583969

39593970
class LoggerTest(BaseTest):
39603971

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)