]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
logging: Add hasHandlers() method to Logger.
authorVinay Sajip <vinay_sajip@yahoo.co.uk>
Mon, 20 Sep 2010 09:55:00 +0000 (09:55 +0000)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>
Mon, 20 Sep 2010 09:55:00 +0000 (09:55 +0000)
Lib/logging/__init__.py
Lib/test/test_logging.py

index 6332f2fbffbf9aaf99f317c69c37eea4e561d05a..134d923c2bde23deba0140025f41425e43c70eee 100644 (file)
@@ -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.
index 2630abbcad1ff609cf194cda189d0a00e80227d4..7506dba125b8483ed1115931aa217a135793bff8 100644 (file)
@@ -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.