Skip to content

Commit cf2a4f9

Browse files
author
Lukasz Langa
committed
bpo-31457: Allow for nested LoggerAdapter objects
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 88031a9 commit cf2a4f9

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)