Skip to content
Permalink
Browse files

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

logging.py: Don't change log level of the root logger to bigger numeric value
  • Loading branch information...
nicoddemus committed Mar 27, 2018
2 parents ed118d7 + 6cfed00 commit 2962c7367cff967b03b46581eafe13c5fd2e2d54
Showing with 66 additions and 2 deletions.
  1. +1 −0 AUTHORS
  2. +1 −1 _pytest/logging.py
  3. +3 −0 changelog/3307.feature.rst
  4. +61 −1 testing/logging/test_reporting.py
@@ -106,6 +106,7 @@ Jurko Gospodnetić
Justyna Janczyszyn
Kale Kundert
Katarzyna Jachim
Katerina Koukiou
Kevin Cox
Kodi B. Arfer
Kostis Anagnostopoulos
@@ -153,7 +153,7 @@ def catching_logs(handler, formatter=None, level=None):
root_logger.addHandler(handler)
if level is not None:
orig_level = root_logger.level
root_logger.setLevel(level)
root_logger.setLevel(min(orig_level, level))
try:
yield handler
finally:
@@ -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.
@@ -49,6 +49,66 @@ def test_foo():
'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):
testdir.makepyfile('''
import logging
@@ -61,7 +121,7 @@ def setup_function(function):
def test_foo():
logger.info('text going to logger from call')
assert False
''')
''')
result = testdir.runpytest('--log-level=INFO')
assert result.ret == 1
result.stdout.fnmatch_lines(['*- Captured *log setup -*',

0 comments on commit 2962c73

Please sign in to comment.
You can’t perform that action at this time.