def pytest_configure(config): if config.getoption('logging_level'): # 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): capture = config.pluginmanager.getplugin('capturemanager') orig_stdout, orig_stderr = sys.stdout, sys.stderr if capture: if hasattr(capture, 'suspend_global_capture'): # pytest >= 3.3 capture.suspend_global_capture() else: # legacy support for pytest <= 3.2 (Fedora 27) capture._capturing.suspend_capturing() sys.stderr.write(self.format(record)) sys.stderr.write('\n') if capture: if hasattr(capture, 'resume_global_capture'): capture.resume_global_capture() else: capture._capturing.resume_capturing() sys.stdout, sys.stderr = orig_stdout, orig_stderr level = convert_log_level(config.getoption('logging_level')) handler = LogHandler() handler.setFormatter(Formatter('[%(name)s] %(message)s')) handler.setLevel(level) root_logger = logging.getLogger() root_logger.addHandler(handler)
def pytest_configure(config): if config.getoption('logging_level'): # 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): capture = config.pluginmanager.getplugin('capturemanager') orig_stdout, orig_stderr = sys.stdout, sys.stderr if capture: capture._capturing.suspend_capturing() sys.stderr.write(self.format(record)) sys.stderr.write('\n') if capture: capture._capturing.resume_capturing() sys.stdout, sys.stderr = orig_stdout, orig_stderr level = convert_log_level(config.getoption('logging_level')) handler = LogHandler() handler.setFormatter(Formatter('[%(name)s] %(message)s')) handler.setLevel(level) root_logger = logging.getLogger() root_logger.addHandler(handler)
def bootstrap(self, parser=None, **overrides): """ Initialize environment variables and logging. """ self.__doing('bootstrap') self.log = log_mgr.get_logger(self) self.env._bootstrap(**overrides) self.env._finalize_core(**dict(DEFAULT_CONFIG)) # Add the argument parser if not parser: parser = self.build_global_parser() self.parser = parser root_logger = logging.getLogger() # If logging has already been configured somewhere else (like in the # installer), don't add handlers or change levels: if root_logger.handlers or self.env.validate_api: return if self.env.debug: level = logging.DEBUG else: level = logging.INFO root_logger.setLevel(level) for attr in self.env: match = re.match( r'^log_logger_level_' r'(debug|info|warn|warning|error|critical|\d+)$', attr) if not match: continue level = ipa_log_manager.convert_log_level(match.group(1)) value = getattr(self.env, attr) regexps = re.split('\s*,\s*', value) # Add the regexp, it maps to the configured level for regexp in regexps: root_logger.addFilter(ipa_log_manager.Filter(regexp, level)) # Add stderr handler: level = logging.INFO if self.env.debug: level = logging.DEBUG else: if self.env.context == 'cli': if self.env.verbose > 0: level = logging.INFO else: level = logging.WARNING handler = logging.StreamHandler() handler.setLevel(level) handler.setFormatter(ipa_log_manager.Formatter(LOGGING_FORMAT_STDERR)) root_logger.addHandler(handler) # Add file handler: if self.env.mode in ('dummy', 'unit_test'): return # But not if in unit-test mode if self.env.log is None: return log_dir = path.dirname(self.env.log) if not path.isdir(log_dir): try: os.makedirs(log_dir) except OSError: logger.error('Could not create log_dir %r', log_dir) return level = logging.INFO if self.env.debug: level = logging.DEBUG try: handler = logging.FileHandler(self.env.log) except IOError as e: logger.error('Cannot open log file %r: %s', self.env.log, e) return handler.setLevel(level) handler.setFormatter(ipa_log_manager.Formatter(LOGGING_FORMAT_FILE)) root_logger.addHandler(handler)
def bootstrap(self, parser=None, **overrides): """ Initialize environment variables and logging. """ self.__doing('bootstrap') self.env._bootstrap(**overrides) self.env._finalize_core(**dict(DEFAULT_CONFIG)) # Add the argument parser if not parser: parser = self.build_global_parser() self.parser = parser root_logger = logging.getLogger() # If logging has already been configured somewhere else (like in the # installer), don't add handlers or change levels: if root_logger.handlers or self.env.validate_api: return if self.env.debug: level = logging.DEBUG else: level = logging.INFO root_logger.setLevel(level) for attr in self.env: match = re.match(r'^log_logger_level_' r'(debug|info|warn|warning|error|critical|\d+)$', attr) if not match: continue level = ipa_log_manager.convert_log_level(match.group(1)) value = getattr(self.env, attr) regexps = re.split('\s*,\s*', value) # Add the regexp, it maps to the configured level for regexp in regexps: root_logger.addFilter(ipa_log_manager.Filter(regexp, level)) # Add stderr handler: level = logging.INFO if self.env.debug: level = logging.DEBUG else: if self.env.context == 'cli': if self.env.verbose > 0: level = logging.INFO else: level = logging.WARNING handler = logging.StreamHandler() handler.setLevel(level) handler.setFormatter(ipa_log_manager.Formatter(LOGGING_FORMAT_STDERR)) root_logger.addHandler(handler) # check after logging is set up but before we create files. fse = sys.getfilesystemencoding() if fse.lower() not in {'utf-8', 'utf8'}: raise errors.SystemEncodingError(encoding=fse) # Add file handler: if self.env.mode in ('dummy', 'unit_test'): return # But not if in unit-test mode if self.env.log is None: return log_dir = path.dirname(self.env.log) if not path.isdir(log_dir): try: os.makedirs(log_dir) except OSError: logger.error('Could not create log_dir %r', log_dir) return level = logging.INFO if self.env.debug: level = logging.DEBUG try: handler = logging.FileHandler(self.env.log) except IOError as e: logger.error('Cannot open log file %r: %s', self.env.log, e) return handler.setLevel(level) handler.setFormatter(ipa_log_manager.Formatter(LOGGING_FORMAT_FILE)) root_logger.addHandler(handler)