Kaydet (Commit) 3ab905f1 authored tarafından Vinay Sajip's avatar Vinay Sajip

Issue #9945: logging: backported locking fixes from py3k.

üst af08f935
...@@ -1180,20 +1180,23 @@ class Logger(Filterer): ...@@ -1180,20 +1180,23 @@ class Logger(Filterer):
""" """
Add the specified handler to this logger. Add the specified handler to this logger.
""" """
if not (hdlr in self.handlers): _acquireLock()
self.handlers.append(hdlr) try:
if not (hdlr in self.handlers):
self.handlers.append(hdlr)
finally:
_releaseLock()
def removeHandler(self, hdlr): def removeHandler(self, hdlr):
""" """
Remove the specified handler from this logger. Remove the specified handler from this logger.
""" """
if hdlr in self.handlers: _acquireLock()
#hdlr.close() try:
hdlr.acquire() if hdlr in self.handlers:
try:
self.handlers.remove(hdlr) self.handlers.remove(hdlr)
finally: finally:
hdlr.release() _releaseLock()
def callHandlers(self, record): def callHandlers(self, record):
""" """
...@@ -1389,26 +1392,28 @@ def basicConfig(**kwargs): ...@@ -1389,26 +1392,28 @@ def basicConfig(**kwargs):
using sys.stdout or sys.stderr), whereas FileHandler closes its stream using sys.stdout or sys.stderr), whereas FileHandler closes its stream
when the handler is closed. when the handler is closed.
""" """
if len(root.handlers) == 0: # Add thread safety in case someone mistakenly calls
filename = kwargs.get("filename") # basicConfig() from multiple threads
if filename: _acquireLock()
mode = kwargs.get("filemode", 'a') try:
hdlr = FileHandler(filename, mode) if len(root.handlers) == 0:
else: filename = kwargs.get("filename")
stream = kwargs.get("stream") if filename:
hdlr = StreamHandler(stream) mode = kwargs.get("filemode", 'a')
fs = kwargs.get("format", BASIC_FORMAT) hdlr = FileHandler(filename, mode)
dfs = kwargs.get("datefmt", None) else:
fmt = Formatter(fs, dfs) stream = kwargs.get("stream")
hdlr.setFormatter(fmt) hdlr = StreamHandler(stream)
root.addHandler(hdlr) fs = kwargs.get("format", BASIC_FORMAT)
level = kwargs.get("level") dfs = kwargs.get("datefmt", None)
if level is not None: fmt = Formatter(fs, dfs)
if str(level) == level: # If a string was passed, do more checks hdlr.setFormatter(fmt)
if level not in _levelNames: root.addHandler(hdlr)
raise ValueError("Unknown level: %r" % level) level = kwargs.get("level")
level = _levelNames[level] if level is not None:
root.setLevel(level) root.setLevel(level)
finally:
_releaseLock()
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Utility functions at module level. # Utility functions at module level.
...@@ -1426,15 +1431,6 @@ def getLogger(name=None): ...@@ -1426,15 +1431,6 @@ def getLogger(name=None):
else: else:
return root return root
#def getRootLogger():
# """
# Return the root logger.
#
# Note that getLogger('') now does the same thing, so this function is
# deprecated and may disappear in the future.
# """
# return root
def critical(msg, *args, **kwargs): def critical(msg, *args, **kwargs):
""" """
Log a message with severity 'CRITICAL' on the root logger. Log a message with severity 'CRITICAL' on the root logger.
...@@ -1543,9 +1539,15 @@ class NullHandler(Handler): ...@@ -1543,9 +1539,15 @@ class NullHandler(Handler):
a NullHandler and add it to the top-level logger of the library module or a NullHandler and add it to the top-level logger of the library module or
package. package.
""" """
def handle(self, record):
pass
def emit(self, record): def emit(self, record):
pass pass
def createLock(self):
self.lock = None
# Warnings integration # Warnings integration
_warnings_showwarning = None _warnings_showwarning = None
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment