From 9cbd2327180055b79acbb37e814006f7176d2291 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 5 Jun 2013 13:06:33 +0200 Subject: Show logs in failed tests Output from IPA's log manager is not captured by Nose's logcapture plugin. Forward IPA logs to a regular Python logger so that they are shown on failures. IPA log messages are also shown on standard error. Filter out Paramiko logs by default; these are too verbose. Part of the work for: https://fedorahosted.org/freeipa/ticket/3621 --- ipatests/beakerlib_plugin.py | 4 ++++ ipatests/ipa-run-tests | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/ipatests/beakerlib_plugin.py b/ipatests/beakerlib_plugin.py index e515bbd21..bd4f8465b 100644 --- a/ipatests/beakerlib_plugin.py +++ b/ipatests/beakerlib_plugin.py @@ -88,6 +88,10 @@ class BeakerLibPlugin(Plugin): self.setup_log_handler(BeakerLibLogHandler(self.run_beakerlib_command)) def setup_log_handler(self, handler): + # Remove the console handler (BeakerLib will print to stderr) + if 'console' in log_mgr.handlers: + log_mgr.remove_handler('console') + # Configure our logger log_mgr.configure( { 'default_level': 'DEBUG', diff --git a/ipatests/ipa-run-tests b/ipatests/ipa-run-tests index fe2cca6f4..b58e49f13 100755 --- a/ipatests/ipa-run-tests +++ b/ipatests/ipa-run-tests @@ -29,9 +29,11 @@ Note that any relative paths given will be based on the ipatests module's path import sys import os from os import path +import logging import nose +from ipapython.ipa_log_manager import log_mgr import ipatests from ipatests.beakerlib_plugin import BeakerLibPlugin from ipatests.order_plugin import OrderTests @@ -43,6 +45,7 @@ cmd = [ '--doctest-tests', '--with-ordered-tests', '--exclude=plugins', + '--logging-filter=-paramiko', '--where', os.path.dirname(ipatests.__file__), ] cmd += sys.argv[1:] @@ -51,4 +54,28 @@ cmd += sys.argv[1:] # This must be set so ipalib.api gets initialized property for tests: os.environ['IPA_UNIT_TEST_MODE'] = 'cli_test' + +# Forward IPA logging to a normal Python logger. Nose's logcapture plugin +# can't work with IPA-managed loggers +class LogHandler(logging.Handler): + name = 'forwarding log handler' + logger = logging.getLogger('IPA') + + def emit(self, record): + self.logger.log(record.levelno, self.format(record)) + +if 'console' in log_mgr.handlers: + log_mgr.remove_handler('console') +log_mgr.configure( + { + 'default_level': 'DEBUG', + 'handlers': [{'log_handler': LogHandler(), + 'format': '[%(name)s] %(message)s', + 'level': 'debug'}, + {'level': 'info', + 'name': 'console', + 'stream': sys.stderr}]}, + configure_state='tests') + + nose.main(argv=cmd, addplugins=[BeakerLibPlugin(), OrderTests()]) -- cgit