logging.py: Don't change log level of the root logger to bigger numeric value

This commit is contained in:
Katerina Koukiou 2018-03-14 09:44:58 +01:00
parent cbb2c55dea
commit d895f5d6fc
4 changed files with 66 additions and 2 deletions

View File

@ -105,6 +105,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
Lawrence Mitchell Lawrence Mitchell

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 should not change 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.

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 -*',