Skip to content

gh-115233: Fix currentframe to get the frame of original caller #115241

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 10 commits into from
Closed
2 changes: 1 addition & 1 deletion Lib/logging/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def addLevelName(level, levelName):
_nameToLevel[levelName] = level

if hasattr(sys, "_getframe"):
currentframe = lambda: sys._getframe(1)
currentframe = lambda: sys._getframe(3)
else: #pragma: no cover
def currentframe():
"""Return the frame object for the caller's stack frame."""
Expand Down
45 changes: 45 additions & 0 deletions Lib/test/test_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -5569,6 +5569,51 @@ def test_extra_merged_log_call_has_precedence(self):
self.assertEqual(record.foo, '2')


class Message:
def __init__(self, fmt, args):
self.fmt = fmt
self.args = args

def __str__(self):
return self.fmt.format(*self.args)


class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super().__init__(logger, extra or {})

def log(self, level, msg, /, *args, **kwargs):
if self.isEnabledFor(level):
msg, kwargs = self.process(msg, kwargs)
self.logger._log(level, Message(msg, args), (), **kwargs)


class TestIssue115233(unittest.TestCase):
_logger = StyleAdapter(logging.getLogger(__name__))

def main(self):
self.logger.info('Logger initialized.')
self._logger.info('test')

def setUp(self):
self.logger = logging.getLogger(__name__)
self.stream = io.StringIO()
formatter = logging.Formatter(
'%(asctime)s %(name)s %(funcName)s %(levelname)s %(message)s')
self.handler = logging.StreamHandler(self.stream)
self.logger.addHandler(self.handler)
self.handler.setFormatter(formatter)
self.logger.setLevel(logging.INFO)

def tearDown(self):
self.logger.removeHandler(self.handler)

def test_main_function_logs_info_message(self):
self.main()
self.handler.flush()
log_output = self.stream.getvalue()
assert 'main' in log_output

class LoggerTest(BaseTest, AssertErrorMessage):

def setUp(self):
Expand Down