@@ -1180,20 +1180,23 @@ def addHandler(self, hdlr):
11801180 """
11811181 Add the specified handler to this logger.
11821182 """
1183- if not (hdlr in self .handlers ):
1184- self .handlers .append (hdlr )
1183+ _acquireLock ()
1184+ try :
1185+ if not (hdlr in self .handlers ):
1186+ self .handlers .append (hdlr )
1187+ finally :
1188+ _releaseLock ()
11851189
11861190 def removeHandler (self , hdlr ):
11871191 """
11881192 Remove the specified handler from this logger.
11891193 """
1190- if hdlr in self .handlers :
1191- #hdlr.close()
1192- hdlr .acquire ()
1193- try :
1194+ _acquireLock ()
1195+ try :
1196+ if hdlr in self .handlers :
11941197 self .handlers .remove (hdlr )
1195- finally :
1196- hdlr . release ()
1198+ finally :
1199+ _releaseLock ()
11971200
11981201 def callHandlers (self , record ):
11991202 """
@@ -1389,26 +1392,28 @@ def basicConfig(**kwargs):
13891392 using sys.stdout or sys.stderr), whereas FileHandler closes its stream
13901393 when the handler is closed.
13911394 """
1392- if len (root .handlers ) == 0 :
1393- filename = kwargs .get ("filename" )
1394- if filename :
1395- mode = kwargs .get ("filemode" , 'a' )
1396- hdlr = FileHandler (filename , mode )
1397- else :
1398- stream = kwargs .get ("stream" )
1399- hdlr = StreamHandler (stream )
1400- fs = kwargs .get ("format" , BASIC_FORMAT )
1401- dfs = kwargs .get ("datefmt" , None )
1402- fmt = Formatter (fs , dfs )
1403- hdlr .setFormatter (fmt )
1404- root .addHandler (hdlr )
1405- level = kwargs .get ("level" )
1406- if level is not None :
1407- if str (level ) == level : # If a string was passed, do more checks
1408- if level not in _levelNames :
1409- raise ValueError ("Unknown level: %r" % level )
1410- level = _levelNames [level ]
1411- root .setLevel (level )
1395+ # Add thread safety in case someone mistakenly calls
1396+ # basicConfig() from multiple threads
1397+ _acquireLock ()
1398+ try :
1399+ if len (root .handlers ) == 0 :
1400+ filename = kwargs .get ("filename" )
1401+ if filename :
1402+ mode = kwargs .get ("filemode" , 'a' )
1403+ hdlr = FileHandler (filename , mode )
1404+ else :
1405+ stream = kwargs .get ("stream" )
1406+ hdlr = StreamHandler (stream )
1407+ fs = kwargs .get ("format" , BASIC_FORMAT )
1408+ dfs = kwargs .get ("datefmt" , None )
1409+ fmt = Formatter (fs , dfs )
1410+ hdlr .setFormatter (fmt )
1411+ root .addHandler (hdlr )
1412+ level = kwargs .get ("level" )
1413+ if level is not None :
1414+ root .setLevel (level )
1415+ finally :
1416+ _releaseLock ()
14121417
14131418#---------------------------------------------------------------------------
14141419# Utility functions at module level.
@@ -1426,15 +1431,6 @@ def getLogger(name=None):
14261431 else :
14271432 return root
14281433
1429- #def getRootLogger():
1430- # """
1431- # Return the root logger.
1432- #
1433- # Note that getLogger('') now does the same thing, so this function is
1434- # deprecated and may disappear in the future.
1435- # """
1436- # return root
1437-
14381434def critical (msg , * args , ** kwargs ):
14391435 """
14401436 Log a message with severity 'CRITICAL' on the root logger.
@@ -1543,9 +1539,15 @@ class NullHandler(Handler):
15431539 a NullHandler and add it to the top-level logger of the library module or
15441540 package.
15451541 """
1542+ def handle (self , record ):
1543+ pass
1544+
15461545 def emit (self , record ):
15471546 pass
15481547
1548+ def createLock (self ):
1549+ self .lock = None
1550+
15491551# Warnings integration
15501552
15511553_warnings_showwarning = None
0 commit comments