Commit 048cf3fe authored by Vinay Sajip's avatar Vinay Sajip

logging: Add hasHandlers() method to Logger.

parent 12e5f58f
...@@ -1240,6 +1240,28 @@ class Logger(Filterer): ...@@ -1240,6 +1240,28 @@ class Logger(Filterer):
finally: finally:
hdlr.release() hdlr.release()
def hasHandlers(self):
"""
See if this logger has any handlers configured.
Loop through all handlers for this logger and its parents in the
logger hierarchy. Return True if a handler was found, else False.
Stop searching up the hierarchy whenever a logger with the "propagate"
attribute set to zero is found - that will be the last logger which
is checked for the existence of handlers.
"""
c = self
rv = False
while c:
if c.handlers:
rv = True
break
if not c.propagate:
break
else:
c = c.parent
return rv
def callHandlers(self, record): def callHandlers(self, record):
""" """
Pass a record to all relevant handlers. Pass a record to all relevant handlers.
......
...@@ -75,8 +75,8 @@ class BaseTest(unittest.TestCase): ...@@ -75,8 +75,8 @@ class BaseTest(unittest.TestCase):
# Set two unused loggers: one non-ASCII and one Unicode. # Set two unused loggers: one non-ASCII and one Unicode.
# This is to test correct operation when sorting existing # This is to test correct operation when sorting existing
# loggers in the configuration code. See issue 8201. # loggers in the configuration code. See issue 8201.
logging.getLogger("\xab\xd7\xbb") self.logger1 = logging.getLogger("\xab\xd7\xbb")
logging.getLogger("\u013f\u00d6\u0047") self.logger2 = logging.getLogger("\u013f\u00d6\u0047")
self.root_logger = logging.getLogger("") self.root_logger = logging.getLogger("")
self.original_logging_level = self.root_logger.getEffectiveLevel() self.original_logging_level = self.root_logger.getEffectiveLevel()
...@@ -86,7 +86,11 @@ class BaseTest(unittest.TestCase): ...@@ -86,7 +86,11 @@ class BaseTest(unittest.TestCase):
self.root_hdlr = logging.StreamHandler(self.stream) self.root_hdlr = logging.StreamHandler(self.stream)
self.root_formatter = logging.Formatter(self.log_format) self.root_formatter = logging.Formatter(self.log_format)
self.root_hdlr.setFormatter(self.root_formatter) self.root_hdlr.setFormatter(self.root_formatter)
self.assertFalse(self.logger1.hasHandlers())
self.assertFalse(self.logger2.hasHandlers())
self.root_logger.addHandler(self.root_hdlr) self.root_logger.addHandler(self.root_hdlr)
self.assertTrue(self.logger1.hasHandlers())
self.assertTrue(self.logger2.hasHandlers())
def tearDown(self): def tearDown(self):
"""Remove our logging stream, and restore the original logging """Remove our logging stream, and restore the original logging
...@@ -1844,7 +1848,6 @@ class RotatingFileHandlerTest(BaseFileTest): ...@@ -1844,7 +1848,6 @@ class RotatingFileHandlerTest(BaseFileTest):
self.assertLogFile(self.fn + ".2") self.assertLogFile(self.fn + ".2")
self.assertFalse(os.path.exists(self.fn + ".3")) self.assertFalse(os.path.exists(self.fn + ".3"))
class TimedRotatingFileHandlerTest(BaseFileTest): class TimedRotatingFileHandlerTest(BaseFileTest):
# test methods added below # test methods added below
pass pass
...@@ -1865,8 +1868,6 @@ for when, exp in (('S', 1), ...@@ -1865,8 +1868,6 @@ for when, exp in (('S', 1),
self.assertEquals(exp, rh.computeRollover(0.0)) self.assertEquals(exp, rh.computeRollover(0.0))
setattr(TimedRotatingFileHandlerTest, "test_compute_rollover_%s" % when, test_compute_rollover) setattr(TimedRotatingFileHandlerTest, "test_compute_rollover_%s" % when, test_compute_rollover)
# Set the locale to the platform-dependent default. I have no idea # Set the locale to the platform-dependent default. I have no idea
# why the test does this, but in any case we save the current locale # why the test does this, but in any case we save the current locale
# first and restore it at the end. # first and restore it at the end.
......
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