8000 [3.13] gh-132106: Ensure that running `logging.handlers.QueueListener… · python/cpython@1dcdac6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1dcdac6

Browse files
authored
[3.13] gh-132106: Ensure that running `logging.handlers.QueueListener… (GH-132471)
Cherry-picked using 5863cd7
1 parent 4ff5d88 commit 1dcdac6

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

Doc/library/logging.handlers.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,10 @@ possible, while any potentially slow operations (such as sending an email via
11721172
This starts up a background thread to monitor the queue for
11731173
LogRecords to process.
11741174

1175+
.. versionchanged:: next
1176+
Raises :exc:`RuntimeError` if called and the listener is already
1177+
running.
1178+
11751179
.. method:: stop()
11761180

11771181
Stops the listener.

Lib/logging/handlers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,6 +1545,9 @@ def start(self):
15451545
This starts up a background thread to monitor the queue for
15461546
LogRecords to process.
15471547
"""
1548+
if self._thread is not None:
1549+
raise RuntimeError("Listener already started")
1550+
15481551
self._thread = t = threading.Thread(target=self._monitor)
15491552
t.daemon = True
15501553
t.start()

Lib/test/test_logging.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4300,8 +4300,6 @@ def test_formatting(self):
43004300
self.assertEqual(formatted_msg, log_record.msg)
43014301
self.assertEqual(formatted_msg, log_record.message)
43024302

4303-
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
4304-
'logging.handlers.QueueListener required for this test')
43054303
def test_queue_listener(self):
43064304
handler = TestHandler(support.Matcher())
43074305
listener = logging.handlers.QueueListener(self.queue, handler)
@@ -4336,8 +4334,18 @@ def test_queue_listener(self):
43364334
self.assertTrue(handler.matches(levelno=logging.CRITICAL, message='6'))
43374335
handler.close()
43384336

4339-
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
4340-
'logging.handlers.QueueListener required for this test')
4337+
# doesn't hurt to call stop() more than once.
4338+
listener.stop()
4339+
self.assertIsNone(listener._thread)
4340+
4341+
def test_queue_listener_multi_start(self):
4342+
handler = TestHandler(support.Matcher())
4343+
listener = logging.handlers.QueueListener(self.queue, handler)
4344+
listener.start()
4345+
self.assertRaises(RuntimeError, listener.start)
4346+
listener.stop()
4347+
self.assertIsNone(listener._thread)
4348+
43414349
def test_queue_listener_with_StreamHandler(self):
43424350
# Test that traceback and stack-info only appends once (bpo-34334, bpo-46755).
43434351
listener = logging.handlers.QueueListener(self.queue, self.root_hdlr)
@@ -4352,8 +4360,6 @@ def test_queue_listener_with_StreamHandler(self):
43524360
self.assertEqual(self.stream.getvalue().strip().count('Traceback'), 1)
43534361
self.assertEqual(self.stream.getvalue().strip().count('Stack'), 1)
43544362
4355-
@unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'),
4356-
'logging.handlers.QueueListener required for this test')
43574363
def test_queue_listener_with_multiple_handlers(self):
43584364
# Test that queue handler format doesn't affect other handler formats (bpo-35726).
43594365
self.que_hdlr.setFormatter(self.root_formatter)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:meth:`QueueListener.start <logging.handlers.QueueListener.start>` now
2+
raises a :exc:`RuntimeError` if the listener is already started.

0 commit comments

Comments
 (0)
0