diff options
author | John Szakmeister <john@szakmeister.net> | 2015-11-28 05:21:15 -0500 |
---|---|---|
committer | John Szakmeister <john@szakmeister.net> | 2015-11-28 05:21:15 -0500 |
commit | bee30813d088b490867cc734bcae2e48b00101a3 (patch) | |
tree | 9c70844660ac5a248aeed2c360cf704bef0021ef | |
parent | 05882fa39ec2f61582768a7df922e88ed5451c6f (diff) | |
parent | 059e4412468bce0211e10ae8ed275122acd758b1 (diff) | |
download | nose-bee30813d088b490867cc734bcae2e48b00101a3.tar.gz |
Merge pull request #948 from adamchainz/logcapture_propagate_false
Fix logcapture plugin to capture output from non-propagating loggers,…
-rw-r--r-- | nose/plugins/logcapture.py | 7 | ||||
-rw-r--r-- | unit_tests/test_logcapture_plugin.py | 18 |
2 files changed, 25 insertions, 0 deletions
diff --git a/nose/plugins/logcapture.py b/nose/plugins/logcapture.py index 4c9a79f..9623ae5 100644 --- a/nose/plugins/logcapture.py +++ b/nose/plugins/logcapture.py @@ -194,6 +194,13 @@ class LogCapture(Plugin): if isinstance(handler, MyMemoryHandler): root_logger.handlers.remove(handler) root_logger.addHandler(self.handler) + # Also patch any non-propagating loggers in the tree + for logger in logging.Logger.manager.loggerDict.values(): + if not getattr(logger, 'propagate', True) and hasattr(logger, "addHandler"): + for handler in logger.handlers[:]: + if isinstance(handler, MyMemoryHandler): + logger.handlers.remove(handler) + logger.addHandler(self.handler) # to make sure everything gets captured loglevel = getattr(self, "loglevel", "NOTSET") root_logger.setLevel(getattr(logging, loglevel)) diff --git a/unit_tests/test_logcapture_plugin.py b/unit_tests/test_logcapture_plugin.py index 63aa651..1f2d50f 100644 --- a/unit_tests/test_logcapture_plugin.py +++ b/unit_tests/test_logcapture_plugin.py @@ -255,3 +255,21 @@ class TestLogCapturePlugin(object): assert msg in ev else: assert msg.encode('utf-8') in ev + + def test_non_propagating_loggers_handled(self): + c = LogCapture() + parser = OptionParser() + c.addOptions(parser, {}) + options, args = parser.parse_args([]) + c.configure(options, Config()) + + logger = logging.getLogger('foo.yes') + logger.propagate = False + + c.start() + logger.debug("test message") + c.end() + + records = c.formatLogRecords() + eq_(1, len(records)) + assert records[0].startswith('foo.yes:'), records[0] |