3636import threading
3737import traceback
3838
39+ from bisect import bisect_left
3940from socketserver import ThreadingTCPServer , StreamRequestHandler
4041
4142
@@ -197,6 +198,21 @@ def _handle_existing_loggers(existing, child_loggers, disable_existing):
197198 else :
198199 logger .disabled = disable_existing
199200
201+ def _discard_existing_logger (name , existing , existing_set , child_loggers ):
202+ """Discard a configured logger and record its existing children."""
203+ if name in existing_set :
204+ prefixed = name + "."
205+ i = bisect_left (existing , prefixed )
206+ num_existing = len (existing )
207+ while i < num_existing :
208+ child = existing [i ]
209+ if not child .startswith (prefixed ):
210+ break
211+ if child in existing_set :
212+ child_loggers .add (child )
213+ i += 1
214+ existing_set .remove (name )
215+
200216def _install_loggers (cp , handlers , disable_existing ):
201217 """Create and install loggers"""
202218
@@ -235,25 +251,17 @@ def _install_loggers(cp, handlers, disable_existing):
235251 #named loggers. With a sorted list it is easier
236252 #to find the child loggers.
237253 existing .sort ()
254+ existing_set = set (existing )
238255 #We'll keep the list of existing loggers
239256 #which are children of named loggers here...
240- child_loggers = []
257+ child_loggers = set ()
241258 #now set up the new ones...
242259 for log in llist :
243260 section = cp ["logger_%s" % log ]
244261 qn = section ["qualname" ]
245262 propagate = section .getint ("propagate" , fallback = 1 )
246263 logger = logging .getLogger (qn )
247- if qn in existing :
248- i = existing .index (qn ) + 1 # start with the entry after qn
249- prefixed = qn + "."
250- pflen = len (prefixed )
251- num_existing = len (existing )
252- while i < num_existing :
253- if existing [i ][:pflen ] == prefixed :
254- child_loggers .append (existing [i ])
255- i += 1
256- existing .remove (qn )
264+ _discard_existing_logger (qn , existing , existing_set , child_loggers )
257265 if "level" in section :
258266 level = section ["level" ]
259267 logger .setLevel (level )
@@ -281,6 +289,7 @@ def _install_loggers(cp, handlers, disable_existing):
281289 # logger.propagate = 1
282290 # elif disable_existing_loggers:
283291 # logger.disabled = 1
292+ existing = [name for name in existing if name in existing_set ]
284293 _handle_existing_loggers (existing , child_loggers , disable_existing )
285294
286295
@@ -638,22 +647,15 @@ def configure(self):
638647 #named loggers. With a sorted list it is easier
639648 #to find the child loggers.
640649 existing .sort ()
650+ existing_set = set (existing )
641651 #We'll keep the list of existing loggers
642652 #which are children of named loggers here...
643- child_loggers = []
653+ child_loggers = set ()
644654 #now set up the new ones...
645655 loggers = config .get ('loggers' , EMPTY_DICT )
646656 for name in loggers :
647- if name in existing :
648- i = existing .index (name ) + 1 # look after name
649- prefixed = name + "."
650- pflen = len (prefixed )
651- num_existing = len (existing )
652- while i < num_existing :
653- if existing [i ][:pflen ] == prefixed :
654- child_loggers .append (existing [i ])
655- i += 1
656- existing .remove (name )
657+ _discard_existing_logger (name , existing , existing_set ,
658+ child_loggers )
657659 try :
658660 self .configure_logger (name , loggers [name ])
659661 except Exception as e :
@@ -673,6 +675,7 @@ def configure(self):
673675 # logger.propagate = True
674676 # elif disable_existing:
675677 # logger.disabled = True
678+ existing = [name for name in existing if name in existing_set ]
676679 _handle_existing_loggers (existing , child_loggers ,
677680 disable_existing )
678681
0 commit comments