@@ -878,6 +878,7 @@ def __init__(self, level=NOTSET):
878878 self ._name = None
879879 self .level = _checkLevel (level )
880880 self .formatter = None
881+ self ._closed = False
881882 # Add the handler to the global _handlerList (for cleanup on shutdown)
882883 _addHandlerRef (self )
883884 self .createLock ()
@@ -996,6 +997,7 @@ def close(self):
996997 #get the module data lock, as we're updating a shared structure.
997998 _acquireLock ()
998999 try : #unlikely to raise an exception, but you never know...
1000+ self ._closed = True
9991001 if self ._name and self ._name in _handlers :
10001002 del _handlers [self ._name ]
10011003 finally :
@@ -1184,6 +1186,8 @@ def close(self):
11841186 finally :
11851187 # Issue #19523: call unconditionally to
11861188 # prevent a handler leak when delay is set
1189+ # Also see Issue #42378: we also rely on
1190+ # self._closed being set to True there
11871191 StreamHandler .close (self )
11881192 finally :
11891193 self .release ()
@@ -1203,10 +1207,15 @@ def emit(self, record):
12031207
12041208 If the stream was not opened because 'delay' was specified in the
12051209 constructor, open it before calling the superclass's emit.
1210+
1211+ If stream is not open, current mode is 'w' and `_closed=True`, record
1212+ will not be emitted (see Issue #42378).
12061213 """
12071214 if self .stream is None :
1208- self .stream = self ._open ()
1209- StreamHandler .emit (self , record )
1215+ if self .mode != 'w' or not self ._closed :
1216+ self .stream = self ._open ()
1217+ if self .stream :
1218+ StreamHandler .emit (self , record )
12101219
12111220 def __repr__ (self ):
12121221 level = getLevelName (self .level )
0 commit comments