Skip to content

Commit 9d8343a

Browse files
committed
Add missing disable_existing_handler check in configure_logger
1 parent 53fb2eb commit 9d8343a

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

Lib/logging/config.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

319330
IDENTIFIER = 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:

Lib/test/test_logging.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3554,7 +3554,6 @@ def test_config15_ok(self):
35543554
handler = logging.root.handlers[0]
35553555
self.addCleanup(closeFileHandler, handler, fn)
35563556

3557-
35583557
def test_config16_ok(self):
35593558
self.apply_config(self.config16)
35603559
h = logging._handlers['hand1']

0 commit comments

Comments
 (0)