@@ -84,12 +84,10 @@ def fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=Non
8484
8585 # critical section
8686 with logging ._lock :
87- # Handle removing specific handlers if specified
88- remove_handlers = cp .defaults ().get ("remove_handlers" , "" )
89- remove_handlers = [h .strip () for h in remove_handlers .split ("," ) if h .strip ()]
90-
91- # Clear only specified handlers
9287 if disable_existing_loggers :
88+ remove_handlers = cp .defaults ().get ("remove_handlers" , "" )
89+ remove_handlers = [h .strip () for h in remove_handlers .split ("," ) if h .strip ()]
90+
9391 _clearExistingHandlers (remove_handlers )
9492
9593 # Handlers add themselves to logging._handlers
@@ -297,24 +295,37 @@ def _clearExistingHandlers(handlers_to_clear=None):
297295 return
298296 handlers_to_remove = []
299297
300- # Handle root logger handlers
298+ def _clearExistingHandlers (handlers_to_clear = None ):
299+ """
300+ Remove and shutdown only the specified handlers.
301+ """
302+ if not handlers_to_clear :
303+ return
304+
305+ handlers_to_remove = []
306+
301307 root = logging .root
308+
309+ # Remove from root logger
302310 for handler in root .handlers [:]:
303311 if handler .name in handlers_to_clear :
304312 root .removeHandler (handler )
305313 handlers_to_remove .append (handler )
314+ handler .clear ()
306315
307- # Handle handlers from other loggers
316+ # Remove from other loggers
308317 for logger_name , logger in root .manager .loggerDict .items ():
309318 if isinstance (logger , logging .Logger ):
310319 for handler in logger .handlers [:]:
311320 if handler .name in handlers_to_clear :
312321 logger .removeHandler (handler )
313322 handlers_to_remove .append (handler )
314323
315- # Shutdown the removed handlers
316324 logging .shutdown (handlers_to_remove )
317325
326+ del handlers_to_clear
327+
328+
318329
319330IDENTIFIER = re .compile ('^[a-z_][a-z0-9_]*$' , re .I )
320331
@@ -602,7 +613,8 @@ def configure(self):
602613 disable_existing = config .pop ('disable_existing_loggers' , True )
603614
604615 if disable_existing :
605- _clearExistingHandlers (remove_handlers )
616+ handlers_to_close = config .pop ('remove_handlers' ,[])
617+ _clearExistingHandlers (handlers_to_close )
606618
607619 # Do formatters first - they don't refer to anything else
608620 formatters = config .get ('formatters' , EMPTY_DICT )
@@ -683,7 +695,7 @@ def configure(self):
683695 i += 1
684696 existing .remove (name )
685697 try :
686- self .configure_logger (name , loggers [name ])
698+ self .configure_logger (name , loggers [name ], disable_existing_handler = disable_existing )
687699 except Exception as e :
688700 raise ValueError ('Unable to configure logger '
689701 '%r' % name ) from e
@@ -924,28 +936,29 @@ def add_handlers(self, logger, handlers):
924936 except Exception as e :
925937 raise ValueError ('Unable to add handler %r' % h ) from e
926938
927- def common_logger_config (self , logger , config , incremental = False ):
939+ def common_logger_config (self , logger , config , incremental = False , disable_existing_handler = True ):
928940 """
929941 Perform configuration which is common to root and non-root loggers.
930942 """
931943 level = config .get ('level' , None )
932944 if level is not None :
933945 logger .setLevel (logging ._checkLevel (level ))
934946 if not incremental :
935- #Remove any existing handlers
936- for h in logger .handlers [:]:
937- logger .removeHandler (h )
947+ if disable_existing_handler :
948+ #Remove any existing handlers if disable_existing_handler is True
949+ for h in logger .handlers [:]:
950+ logger .removeHandler (h )
938951 handlers = config .get ('handlers' , None )
939952 if handlers :
940953 self .add_handlers (logger , handlers )
941954 filters = config .get ('filters' , None )
942955 if filters :
943956 self .add_filters (logger , filters )
944957
945- def configure_logger (self , name , config , incremental = False ):
958+ def configure_logger (self , name , config , incremental = False , disable_existing_handler = True ):
946959 """Configure a non-root logger from a dictionary."""
947960 logger = logging .getLogger (name )
948- self .common_logger_config (logger , config , incremental )
961+ self .common_logger_config (logger , config , incremental , disable_existing_handler )
949962 logger .disabled = False
950963 propagate = config .get ('propagate' , None )
951964 if propagate is not None :
0 commit comments