bpo-42378: fixed log truncation on logging shutdown (GH-27310)

Automerge-Triggered-By: GH:vsajip
This commit is contained in:
andrei kulakov 2021-07-25 16:17:47 -04:00 committed by GitHub
parent 9751f85914
commit 96cf5a63d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 6 deletions

View file

@ -882,6 +882,7 @@ class Handler(Filterer):
self._name = None
self.level = _checkLevel(level)
self.formatter = None
self._closed = False
# Add the handler to the global _handlerList (for cleanup on shutdown)
_addHandlerRef(self)
self.createLock()
@ -1000,6 +1001,7 @@ class Handler(Filterer):
#get the module data lock, as we're updating a shared structure.
_acquireLock()
try: #unlikely to raise an exception, but you never know...
self._closed = True
if self._name and self._name in _handlers:
del _handlers[self._name]
finally:
@ -1188,6 +1190,8 @@ class FileHandler(StreamHandler):
finally:
# Issue #19523: call unconditionally to
# prevent a handler leak when delay is set
# Also see Issue #42378: we also rely on
# self._closed being set to True there
StreamHandler.close(self)
finally:
self.release()
@ -1207,10 +1211,15 @@ class FileHandler(StreamHandler):
If the stream was not opened because 'delay' was specified in the
constructor, open it before calling the superclass's emit.
If stream is not open, current mode is 'w' and `_closed=True`, record
will not be emitted (see Issue #42378).
"""
if self.stream is None:
self.stream = self._open()
StreamHandler.emit(self, record)
if self.mode != 'w' or not self._closed:
self.stream = self._open()
if self.stream:
StreamHandler.emit(self, record)
def __repr__(self):
level = getLevelName(self.level)