Merge pull request #3307 from KKoukiou/rhv-qe-fix

logging.py: Don't change log level of the root logger to bigger numeric value
This commit is contained in:
Bruno Oliveira 2018-03-27 18:03:22 -03:00 committed by GitHub
commit 2962c7367c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 66 additions and 2 deletions

View File

@ -106,6 +106,7 @@ Jurko Gospodnetić
Justyna Janczyszyn Justyna Janczyszyn
Kale Kundert Kale Kundert
Katarzyna Jachim Katarzyna Jachim
Katerina Koukiou
Kevin Cox Kevin Cox
Kodi B. Arfer Kodi B. Arfer
Kostis Anagnostopoulos Kostis Anagnostopoulos

View File

@ -153,7 +153,7 @@ def catching_logs(handler, formatter=None, level=None):
root_logger.addHandler(handler) root_logger.addHandler(handler)
if level is not None: if level is not None:
orig_level = root_logger.level orig_level = root_logger.level
root_logger.setLevel(level) root_logger.setLevel(min(orig_level, level))
try: try:
yield handler yield handler
finally: finally:

View File

@ -0,0 +1,3 @@
pytest not longer changes the log level of the root logger when the
``log-level`` parameter has greater numeric value than that of the level of
the root logger, which makes it play better with custom logging configuration in user code.

View File

@ -49,6 +49,66 @@ def test_messages_logged(testdir):
'text going to stderr']) 'text going to stderr'])
def test_root_logger_affected(testdir):
testdir.makepyfile("""
import logging
logger = logging.getLogger()
def test_foo():
logger.info('info text ' + 'going to logger')
logger.warning('warning text ' + 'going to logger')
logger.error('error text ' + 'going to logger')
assert 0
""")
log_file = testdir.tmpdir.join('pytest.log').strpath
result = testdir.runpytest('--log-level=ERROR', '--log-file=pytest.log')
assert result.ret == 1
# the capture log calls in the stdout section only contain the
# logger.error msg, because --log-level=ERROR
result.stdout.fnmatch_lines(['*error text going to logger*'])
with pytest.raises(pytest.fail.Exception):
result.stdout.fnmatch_lines(['*warning text going to logger*'])
with pytest.raises(pytest.fail.Exception):
result.stdout.fnmatch_lines(['*info text going to logger*'])
# the log file should contain the warning and the error log messages and
# not the info one, because the default level of the root logger is
# WARNING.
assert os.path.isfile(log_file)
with open(log_file) as rfh:
contents = rfh.read()
assert "info text going to logger" not in contents
assert "warning text going to logger" in contents
assert "error text going to logger" in contents
def test_log_cli_level_log_level_interaction(testdir):
testdir.makepyfile("""
import logging
logger = logging.getLogger()
def test_foo():
logger.debug('debug text ' + 'going to logger')
logger.info('info text ' + 'going to logger')
logger.warning('warning text ' + 'going to logger')
logger.error('error text ' + 'going to logger')
assert 0
""")
result = testdir.runpytest('--log-cli-level=INFO', '--log-level=ERROR')
assert result.ret == 1
result.stdout.fnmatch_lines([
'*-- live log call --*',
'*INFO*info text going to logger',
'*WARNING*warning text going to logger',
'*ERROR*error text going to logger',
'=* 1 failed in *=',
])
assert 'DEBUG' not in result.stdout.str()
def test_setup_logging(testdir): def test_setup_logging(testdir):
testdir.makepyfile(''' testdir.makepyfile('''
import logging import logging
@ -61,7 +121,7 @@ def test_setup_logging(testdir):
def test_foo(): def test_foo():
logger.info('text going to logger from call') logger.info('text going to logger from call')
assert False assert False
''') ''')
result = testdir.runpytest('--log-level=INFO') result = testdir.runpytest('--log-level=INFO')
assert result.ret == 1 assert result.ret == 1
result.stdout.fnmatch_lines(['*- Captured *log setup -*', result.stdout.fnmatch_lines(['*- Captured *log setup -*',