Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Doc/library/logging.handlers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,10 @@ possible, while any potentially slow operations (such as sending an email via
This starts up a background thread to monitor the queue for
LogRecords to process.

.. versionchanged:: next
Raises :exc:`RuntimeError` if called and the listener is already
running.

.. method:: stop()

Stops the listener.
Expand Down
4 changes: 4 additions & 0 deletions Doc/whatsnew/3.14.rst
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,10 @@ logging.handlers
manager protocol, allowing it to be used in a :keyword:`with` statement.
(Contributed by Charles Machalow in :gh:`132106`.)

* :meth:`~logging.handlers.QueueListener.start` will raise a :exc:`RuntimeError`
if the listener is already started.
(Contributed by Charles Machalow in :gh:`132106`.)


mimetypes
---------
Expand Down
3 changes: 3 additions & 0 deletions Lib/logging/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1561,6 +1561,9 @@ def start(self):
This starts up a background thread to monitor the queue for
LogRecords to process.
"""
if self._thread is not None:
raise RuntimeError("Listener already started")

self._thread = t = threading.Thread(target=self._monitor)
t.daemon = True
t.start()
Expand Down
11 changes: 11 additions & 0 deletions Lib/test/test_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -4356,6 +4356,17 @@ def test_queue_listener_context_manager(self):
listener.stop()
self.assertIsNone(listener._thread)

def test_queue_listener_multi_start(self):
handler = TestHandler(support.Matcher())
with logging.handlers.QueueListener(self.queue, handler) as listener:
self.assertRaises(RuntimeError, listener.start)

with listener:
self.assertRaises(RuntimeError, listener.start)

listener.start()
listener.stop()

def test_queue_listener_with_StreamHandler(self):
# Test that traceback and stack-info only appends once (bpo-34334, bpo-46755).
listener = logging.handlers.QueueListener(self.queue, self.root_hdlr)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
:meth:`~logging.handlers.QueueListener.start` will raise a
:exc:`RuntimeError` if the listener is already started.
Loading