summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Montnemery <erik@montnemery.com>2022-07-05 14:23:12 (GMT)
committerGitHub <noreply@github.com>2022-07-05 14:23:12 (GMT)
commitc60f125533b8808317c1370450f0535430d59d8c (patch)
treef7ae0ef6c786f91dcbd9b15498d1d6d5c32b784f
parent324d01944d16868b07df9e8eef6987766a31a36d (diff)
downloadcpython-c60f125533b8808317c1370450f0535430d59d8c.zip
cpython-c60f125533b8808317c1370450f0535430d59d8c.tar.gz
cpython-c60f125533b8808317c1370450f0535430d59d8c.tar.bz2
bpo-46755: Don't log stack info twice in QueueHandler (GH-31355)
-rw-r--r--Doc/library/logging.handlers.rst2
-rw-r--r--Lib/logging/handlers.py3
-rw-r--r--Lib/test/test_logging.py4
-rw-r--r--Misc/NEWS.d/next/Library/2022-02-15-12-40-48.bpo-46755.zePJfx.rst2
4 files changed, 8 insertions, 3 deletions
diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst
index 4bdd550..1447cab 100644
--- a/Doc/library/logging.handlers.rst
+++ b/Doc/library/logging.handlers.rst
@@ -1034,7 +1034,7 @@ possible, while any potentially slow operations (such as sending an email via
method is enqueued.
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
the record's :attr:`msg` and :attr:`message` attributes with the merged
message (obtained by calling the handler's :meth:`format` method), and
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index b4c8a3b..1c8226c 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -1456,7 +1456,7 @@ class QueueHandler(logging.Handler):
# (if there's exception data), and also returns the formatted
# message. We can then use this to replace the original
# 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.
msg = self.format(record)
# 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.exc_info = None
record.exc_text = None
+ record.stack_info = None
return record
def emit(self, record):
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 0aec072..a900dab 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -3808,7 +3808,7 @@ class QueueHandlerTest(BaseTest):
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
'logging.handlers.QueueListener required for this test')
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.start()
try:
@@ -3816,8 +3816,10 @@ class QueueHandlerTest(BaseTest):
except ZeroDivisionError as e:
exc = e
self.que_logger.exception(self.next_message(), exc_info=exc)
+ self.que_logger.error(self.next_message(), stack_info=True)
listener.stop()
self.assertEqual(self.stream.getvalue().strip().count('Traceback'), 1)
+ self.assertEqual(self.stream.getvalue().strip().count('Stack'), 1)
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
'logging.handlers.QueueListener required for this test')
diff --git a/Misc/NEWS.d/next/Library/2022-02-15-12-40-48.bpo-46755.zePJfx.rst b/Misc/NEWS.d/next/Library/2022-02-15-12-40-48.bpo-46755.zePJfx.rst
new file mode 100644
index 0000000..399caf7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-02-15-12-40-48.bpo-46755.zePJfx.rst
@@ -0,0 +1,2 @@
+In :class:`QueueHandler`, clear ``stack_info`` from :class:`LogRecord` to
+prevent stack trace from being written twice.