summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Szakmeister <john@szakmeister.net>2015-11-28 05:21:15 -0500
committerJohn Szakmeister <john@szakmeister.net>2015-11-28 05:21:15 -0500
commitbee30813d088b490867cc734bcae2e48b00101a3 (patch)
tree9c70844660ac5a248aeed2c360cf704bef0021ef
parent05882fa39ec2f61582768a7df922e88ed5451c6f (diff)
parent059e4412468bce0211e10ae8ed275122acd758b1 (diff)
downloadnose-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.py7
-rw-r--r--unit_tests/test_logcapture_plugin.py18
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]