diff options
author | andrei kulakov <andrei.avk@gmail.com> | 2021-07-25 20:17:47 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-25 20:17:47 (GMT) |
commit | 96cf5a63d2dbadaebf236362b4c7c09c51fda55c (patch) | |
tree | da05ccb42a61b60454a842cc1a1dcb8e322327d2 /Lib/logging | |
parent | 9751f85914e0ef3324671a91da34a635d48b17fb (diff) | |
download | cpython-96cf5a63d2dbadaebf236362b4c7c09c51fda55c.zip cpython-96cf5a63d2dbadaebf236362b4c7c09c51fda55c.tar.gz cpython-96cf5a63d2dbadaebf236362b4c7c09c51fda55c.tar.bz2 |
bpo-42378: fixed log truncation on logging shutdown (GH-27310)
Automerge-Triggered-By: GH:vsajip
Diffstat (limited to 'Lib/logging')
-rw-r--r-- | Lib/logging/__init__.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 3538f06..e49e0d0 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -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) |