@@ -340,7 +340,8 @@ def _setup_cli_logging(self):
340340 """
341341 terminal_reporter = self ._config .pluginmanager .get_plugin ('terminalreporter' )
342342 if self ._config .getini ('log_cli' ) and terminal_reporter is not None :
343- log_cli_handler = _LiveLoggingStreamHandler (terminal_reporter ._tw )
343+ capture_manager = self ._config .pluginmanager .get_plugin ('capturemanager' )
344+ log_cli_handler = _LiveLoggingStreamHandler (terminal_reporter , capture_manager )
344345 log_cli_format = get_option_ini (self ._config , 'log_cli_format' , 'log_format' )
345346 log_cli_date_format = get_option_ini (self ._config , 'log_cli_date_format' , 'log_date_format' )
346347 log_cli_formatter = logging .Formatter (log_cli_format , datefmt = log_cli_date_format )
@@ -356,12 +357,30 @@ class _LiveLoggingStreamHandler(logging.StreamHandler):
356357 """
357358 Custom StreamHandler used by the live logging feature: it will write a newline before the first log message
358359 in each test.
360+
361+ During live logging we must also explicitly disable stdout/stderr capturing otherwise it will get captured
362+ and won't appear in the terminal.
359363 """
360364
365+ def __init__ (self , terminal_reporter , capture_manager ):
366+ """
367+ :param _pytest.terminal.TerminalReporter terminal_reporter:
368+ :param _pytest.capture.CaptureManager capture_manager:
369+ """
370+ logging .StreamHandler .__init__ (self , stream = terminal_reporter )
371+ self .capture_manager = capture_manager
372+ self ._first_record_emitted = False
373+
361374 def emit (self , record ):
362- if not getattr (self , '_first_record_emitted' , False ):
363- self .stream .write ('\n ' )
364- # we might consider adding a header at this point using self.stream.sep('-', 'live log') or something
365- # similar when we improve live logging output
366- self ._first_record_emitted = True
367- logging .StreamHandler .emit (self , record )
375+ if self .capture_manager is not None :
376+ self .capture_manager .suspend_global_capture ()
377+ try :
378+ if not self ._first_record_emitted :
379+ self .stream .write ('\n ' )
380+ # we might consider adding a header at this point using self.stream.section('live log', sep='-')
381+ # or something similar when we improve live logging output
382+ self ._first_record_emitted = True
383+ logging .StreamHandler .emit (self , record )
384+ finally :
385+ if self .capture_manager is not None :
386+ self .capture_manager .resume_global_capture ()
0 commit comments