gh-95804: Respect MemoryHandler.flushOnClose in logging shutdown. (GH-95857)
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index dc28702..afb5234 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py
@@ -2245,7 +2245,11 @@ def shutdown(handlerList=_handlerList): if h: try: h.acquire() - h.flush() + # MemoryHandlers might not want to be flushed on close, + # but circular imports prevent us scoping this to just + # those handlers. hence the default to True. + if getattr(h, 'flushOnClose', True): + h.flush() h.close() except (OSError, ValueError): # Ignore errors which might be caused
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index a505e80..99ea2f6 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py
@@ -1225,6 +1225,35 @@ def test_flush_on_close(self): # assert that no new lines have been added self.assert_log_lines(lines) # no change + def test_shutdown_flush_on_close(self): + """ + Test that the flush-on-close configuration is respected by the + shutdown method. + """ + self.mem_logger.debug(self.next_message()) + self.assert_log_lines([]) + self.mem_logger.info(self.next_message()) + self.assert_log_lines([]) + # Default behaviour is to flush on close. Check that it happens. + logging.shutdown(handlerList=[logging.weakref.ref(self.mem_hdlr)]) + lines = [ + ('DEBUG', '1'), + ('INFO', '2'), + ] + self.assert_log_lines(lines) + # Now configure for flushing not to be done on close. + self.mem_hdlr = logging.handlers.MemoryHandler(10, logging.WARNING, + self.root_hdlr, + False) + self.mem_logger.addHandler(self.mem_hdlr) + self.mem_logger.debug(self.next_message()) + self.assert_log_lines(lines) # no change + self.mem_logger.info(self.next_message()) + self.assert_log_lines(lines) # no change + # assert that no new lines have been added after shutdown + logging.shutdown(handlerList=[logging.weakref.ref(self.mem_hdlr)]) + self.assert_log_lines(lines) # no change + @threading_helper.requires_working_threading() def test_race_between_set_target_and_flush(self): class MockRaceConditionHandler:
diff --git a/Misc/ACKS b/Misc/ACKS index 28b4ce4..c1f570a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS
@@ -198,6 +198,7 @@ Carl Friedrich Bolz-Tereick Forest Bond Gregory Bond +David Bonner Angelin Booz Médéric Boquien Matias Bordese
diff --git a/Misc/NEWS.d/next/Library/2022-08-10-11-54-04.gh-issue-95804.i5FCFK.rst b/Misc/NEWS.d/next/Library/2022-08-10-11-54-04.gh-issue-95804.i5FCFK.rst new file mode 100644 index 0000000..46434cb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-08-10-11-54-04.gh-issue-95804.i5FCFK.rst
@@ -0,0 +1,2 @@ +Fix ``logging`` shutdown handler so it respects +``MemoryHandler.flushOnClose``.