+ def open_user_log(self, filename, level=logging.INFO):
+ """Open user (progress) logfile. Leaves logging to stdout active."""
+ h = StreamHandler(open(filename, 'w', 0))
+ h.setFormatter(Formatter('%(message)s'))
+ self.user.addHandler(h)
+ self.user.debug('Logging started')
+
+ def open_eval_log(self, filename, level, redirect_fds = True):
+ """Open user (progress) logfile.
+ Leaves logging to stderr active. If told to, redirects fd's 1 and 2 to this file."""
+ self.eval_file = open(filename, 'w', 0)
+ self.eval_handler = StreamHandler(self.eval_file)
+ self.eval_handler.setFormatter(Formatter('%(message)s'))
+ self.user.addHandler(self.eval_handler)
+ if redirect_fds:
+ os.dup2(self.eval_file.fileno(), 1)
+ os.dup2(self.eval_file.fileno(), 2)
+ self.user.debug('Logging started')
+
+ def open_test_log(self, filename, level):
+ """Open per-test log file, like "{TEST}.log". Also set handler level to `level`."""
+ self.debug('Opening per-test log %s' % filename)
+ if self.test_handler:
+ self.close_test_log()
+ self.test_file = open(filename, 'w')
+ self.test_handler = StreamHandler(self.test_file)
+ self.test.addHandler(self.test_handler)
+ self.test.setLevel(level)
+ self.test_handler.setFormatter(Formatter('%(asctime)s [%(levelno)s] %(message)s'))
+ self.test.debug('Logging started')
+
+ def close_test_log(self):
+ """Close per-test logfile, leaving only the null handler."""
+ if self.test_handler:
+ self.test.info('Closing logfile' % filename)
+ self.test.removeHandler(self.test_handler)
+ self.test_handler = None
+ self.test_file.close()
+
+ def ddebug(self, msg, *args, **kwargs):
+ """Log with priority 5 (normal DEBUG is 10)"""
+ self.log(5, msg, *args, **kwargs)