From fc490c03b7f7da6bf987c16bebd9feddeab1c5a8 Mon Sep 17 00:00:00 2001 From: Alexis Lee Date: Wed, 16 Mar 2016 16:34:20 +0000 Subject: [PATCH] log: Introduce _iter_loggers Ic58dafceefde1b109721a58631c223522bf4cc9c introduces this function for Victor's rate_limit module. I also want it for my global_filter and mutable logging config patches so it seems sensible to have it centrally and reuse it. Change-Id: I9571badcfc437fb7d565d8dc9632792862e20b3f Co-Authored-By: Victor Stinner --- oslo_log/log.py | 16 ++++++++++++++++ oslo_log/tests/unit/test_log.py | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/oslo_log/log.py b/oslo_log/log.py index d3919d40..c956f501 100644 --- a/oslo_log/log.py +++ b/oslo_log/log.py @@ -79,6 +79,22 @@ def _get_log_file_path(conf, binary=None): return None +def _iter_loggers(): + """Iterate on existing loggers.""" + + # Sadly, Logger.manager and Manager.loggerDict are not documented, + # but there is no logging public function to iterate on all loggers. + + # The root logger is not part of loggerDict. + yield logging.getLogger() + + manager = logging.Logger.manager + for logger in manager.loggerDict.values(): + if isinstance(logger, logging.PlaceHolder): + continue + yield logger + + class BaseLoggerAdapter(logging.LoggerAdapter): warn = logging.LoggerAdapter.warning diff --git a/oslo_log/tests/unit/test_log.py b/oslo_log/tests/unit/test_log.py index 2e22622d..61b76cca 100644 --- a/oslo_log/tests/unit/test_log.py +++ b/oslo_log/tests/unit/test_log.py @@ -215,6 +215,12 @@ class LogHandlerTestCase(BaseTestCase): binary=prefix), expected) + def test_iter_loggers(self): + mylog = logging.getLogger("abc.cde") + loggers = list(log._iter_loggers()) + self.assertIn(logging.getLogger(), loggers) + self.assertIn(mylog, loggers) + class SysLogHandlersTestCase(BaseTestCase): """Test the standard Syslog handler."""