mirror of
https://github.com/python/cpython.git
synced 2025-07-24 19:54:21 +00:00
bpo-46755: Don't log stack info twice in QueueHandler (GH-31355)
This commit is contained in:
parent
324d01944d
commit
c60f125533
4 changed files with 8 additions and 3 deletions
|
@ -1034,7 +1034,7 @@ possible, while any potentially slow operations (such as sending an email via
|
||||||
method is enqueued.
|
method is enqueued.
|
||||||
|
|
||||||
The base implementation formats the record to merge the message,
|
The base implementation formats the record to merge the message,
|
||||||
arguments, and exception information, if present. It also removes
|
arguments, exception and stack information, if present. It also removes
|
||||||
unpickleable items from the record in-place. Specifically, it overwrites
|
unpickleable items from the record in-place. Specifically, it overwrites
|
||||||
the record's :attr:`msg` and :attr:`message` attributes with the merged
|
the record's :attr:`msg` and :attr:`message` attributes with the merged
|
||||||
message (obtained by calling the handler's :meth:`format` method), and
|
message (obtained by calling the handler's :meth:`format` method), and
|
||||||
|
|
|
@ -1456,7 +1456,7 @@ class QueueHandler(logging.Handler):
|
||||||
# (if there's exception data), and also returns the formatted
|
# (if there's exception data), and also returns the formatted
|
||||||
# message. We can then use this to replace the original
|
# message. We can then use this to replace the original
|
||||||
# msg + args, as these might be unpickleable. We also zap the
|
# msg + args, as these might be unpickleable. We also zap the
|
||||||
# exc_info and exc_text attributes, as they are no longer
|
# exc_info, exc_text and stack_info attributes, as they are no longer
|
||||||
# needed and, if not None, will typically not be pickleable.
|
# needed and, if not None, will typically not be pickleable.
|
||||||
msg = self.format(record)
|
msg = self.format(record)
|
||||||
# bpo-35726: make copy of record to avoid affecting other handlers in the chain.
|
# bpo-35726: make copy of record to avoid affecting other handlers in the chain.
|
||||||
|
@ -1466,6 +1466,7 @@ class QueueHandler(logging.Handler):
|
||||||
record.args = None
|
record.args = None
|
||||||
record.exc_info = None
|
record.exc_info = None
|
||||||
record.exc_text = None
|
record.exc_text = None
|
||||||
|
record.stack_info = None
|
||||||
return record
|
return record
|
||||||
|
|
||||||
def emit(self, record):
|
def emit(self, record):
|
||||||
|
|
|
@ -3808,7 +3808,7 @@ class QueueHandlerTest(BaseTest):
|
||||||
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
|
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
|
||||||
'logging.handlers.QueueListener required for this test')
|
'logging.handlers.QueueListener required for this test')
|
||||||
def test_queue_listener_with_StreamHandler(self):
|
def test_queue_listener_with_StreamHandler(self):
|
||||||
# Test that traceback only appends once (bpo-34334).
|
# Test that traceback and stack-info only appends once (bpo-34334, bpo-46755).
|
||||||
listener = logging.handlers.QueueListener(self.queue, self.root_hdlr)
|
listener = logging.handlers.QueueListener(self.queue, self.root_hdlr)
|
||||||
listener.start()
|
listener.start()
|
||||||
try:
|
try:
|
||||||
|
@ -3816,8 +3816,10 @@ class QueueHandlerTest(BaseTest):
|
||||||
except ZeroDivisionError as e:
|
except ZeroDivisionError as e:
|
||||||
exc = e
|
exc = e
|
||||||
self.que_logger.exception(self.next_message(), exc_info=exc)
|
self.que_logger.exception(self.next_message(), exc_info=exc)
|
||||||
|
self.que_logger.error(self.next_message(), stack_info=True)
|
||||||
listener.stop()
|
listener.stop()
|
||||||
self.assertEqual(self.stream.getvalue().strip().count('Traceback'), 1)
|
self.assertEqual(self.stream.getvalue().strip().count('Traceback'), 1)
|
||||||
|
self.assertEqual(self.stream.getvalue().strip().count('Stack'), 1)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
|
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
|
||||||
'logging.handlers.QueueListener required for this test')
|
'logging.handlers.QueueListener required for this test')
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
In :class:`QueueHandler`, clear ``stack_info`` from :class:`LogRecord` to
|
||||||
|
prevent stack trace from being written twice.
|
Loading…
Add table
Add a link
Reference in a new issue