summaryrefslogtreecommitdiffstats
path: root/Lib/logging
diff options
context:
space:
mode:
authorandrei kulakov <andrei.avk@gmail.com>2021-07-25 20:17:47 (GMT)
committerGitHub <noreply@github.com>2021-07-25 20:17:47 (GMT)
commit96cf5a63d2dbadaebf236362b4c7c09c51fda55c (patch)
treeda05ccb42a61b60454a842cc1a1dcb8e322327d2 /Lib/logging
parent9751f85914e0ef3324671a91da34a635d48b17fb (diff)
downloadcpython-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__.py13
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)