@@ -48,6 +48,9 @@ def add_option_ini(option, dest, default=None, type=None, **kwargs):
48
48
'--log-date-format' ,
49
49
dest = 'log_date_format' , default = DEFAULT_LOG_DATE_FORMAT ,
50
50
help = 'log date format as used by the logging module.' )
51
+ parser .addini (
52
+ 'log_cli' , default = False , type = 'bool' ,
53
+ help = 'enable log display during test run (also known as "live logging").' )
51
54
add_option_ini (
52
55
'--log-cli-level' ,
53
56
dest = 'log_cli_level' , default = None ,
@@ -234,8 +237,12 @@ def get_actual_log_level(config, *setting_names):
234
237
235
238
236
239
def pytest_configure (config ):
237
- config .pluginmanager .register (LoggingPlugin (config ),
238
- 'logging-plugin' )
240
+ config .pluginmanager .register (LoggingPlugin (config ), 'logging-plugin' )
241
+
242
+
243
+ @contextmanager
244
+ def _dummy_context_manager ():
245
+ yield
239
246
240
247
241
248
class LoggingPlugin (object ):
@@ -248,26 +255,29 @@ def __init__(self, config):
248
255
The formatter can be safely shared across all handlers so
249
256
create a single one for the entire test session here.
250
257
"""
251
- self .log_cli_level = get_actual_log_level (
252
- config , 'log_cli_level' , 'log_level' ) or logging .WARNING
253
-
254
258
self .print_logs = get_option_ini (config , 'log_print' )
255
259
self .formatter = logging .Formatter (
256
260
get_option_ini (config , 'log_format' ),
257
261
get_option_ini (config , 'log_date_format' ))
258
262
259
- log_cli_handler = logging .StreamHandler (sys .stderr )
260
- log_cli_format = get_option_ini (
261
- config , 'log_cli_format' , 'log_format' )
262
- log_cli_date_format = get_option_ini (
263
- config , 'log_cli_date_format' , 'log_date_format' )
264
- log_cli_formatter = logging .Formatter (
265
- log_cli_format ,
266
- datefmt = log_cli_date_format )
267
- self .log_cli_handler = log_cli_handler # needed for a single unittest
268
- self .live_logs = catching_logs (log_cli_handler ,
269
- formatter = log_cli_formatter ,
270
- level = self .log_cli_level )
263
+ if config .getini ('log_cli' ):
264
+ log_cli_handler = logging .StreamHandler (sys .stderr )
265
+ log_cli_format = get_option_ini (
266
+ config , 'log_cli_format' , 'log_format' )
267
+ log_cli_date_format = get_option_ini (
268
+ config , 'log_cli_date_format' , 'log_date_format' )
269
+ log_cli_formatter = logging .Formatter (
270
+ log_cli_format ,
271
+ datefmt = log_cli_date_format )
272
+ log_cli_level = get_actual_log_level (
273
+ config , 'log_cli_level' , 'log_level' ) or logging .WARNING
274
+ self .log_cli_handler = log_cli_handler # needed for a single unittest
275
+ self .live_logs_context = catching_logs (log_cli_handler ,
276
+ formatter = log_cli_formatter ,
277
+ level = log_cli_level )
278
+ else :
279
+ self .log_cli_handler = None
280
+ self .live_logs_context = _dummy_context_manager ()
271
281
272
282
log_file = get_option_ini (config , 'log_file' )
273
283
if log_file :
@@ -328,7 +338,7 @@ def pytest_runtest_teardown(self, item):
328
338
@pytest .hookimpl (hookwrapper = True )
329
339
def pytest_runtestloop (self , session ):
330
340
"""Runs all collected test items."""
331
- with self .live_logs :
341
+ with self .live_logs_context :
332
342
if self .log_file_handler is not None :
333
343
with closing (self .log_file_handler ):
334
344
with catching_logs (self .log_file_handler ,
0 commit comments