From b4a0809ad79dbbd9c263b523499b8f0a0136aa7a Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Mon, 20 Sep 2010 09:55:00 +0000 Subject: [PATCH] logging: Add hasHandlers() method to Logger. --- Lib/logging/__init__.py | 22 ++++++++++++++++++++++ Lib/test/test_logging.py | 11 ++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 6332f2fbffb..134d923c2bd 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1240,6 +1240,28 @@ class Logger(Filterer): finally: 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): """ Pass a record to all relevant handlers. diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 2630abbcad1..7506dba125b 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -75,8 +75,8 @@ class BaseTest(unittest.TestCase): # Set two unused loggers: one non-ASCII and one Unicode. # This is to test correct operation when sorting existing # loggers in the configuration code. See issue 8201. - logging.getLogger("\xab\xd7\xbb") - logging.getLogger("\u013f\u00d6\u0047") + self.logger1 = logging.getLogger("\xab\xd7\xbb") + self.logger2 = logging.getLogger("\u013f\u00d6\u0047") self.root_logger = logging.getLogger("") self.original_logging_level = self.root_logger.getEffectiveLevel() @@ -86,7 +86,11 @@ class BaseTest(unittest.TestCase): self.root_hdlr = logging.StreamHandler(self.stream) self.root_formatter = logging.Formatter(self.log_format) 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.assertTrue(self.logger1.hasHandlers()) + self.assertTrue(self.logger2.hasHandlers()) def tearDown(self): """Remove our logging stream, and restore the original logging @@ -1844,7 +1848,6 @@ class RotatingFileHandlerTest(BaseFileTest): self.assertLogFile(self.fn + ".2") self.assertFalse(os.path.exists(self.fn + ".3")) - class TimedRotatingFileHandlerTest(BaseFileTest): # test methods added below pass @@ -1865,8 +1868,6 @@ for when, exp in (('S', 1), self.assertEquals(exp, rh.computeRollover(0.0)) setattr(TimedRotatingFileHandlerTest, "test_compute_rollover_%s" % when, test_compute_rollover) - - # 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 # first and restore it at the end.