Fixes issue #11314 - log_file_format does not default to log_format (#11444)

* Fixes issue #11314 -

* Incorporated review comments for issue #11314

* Update changelog/11314.improvement.rst

Co-authored-by: Bruno Oliveira <bruno@soliv.dev>

---------

Co-authored-by: Zac Hatfield-Dodds <zac.hatfield.dodds@gmail.com>
Co-authored-by: Bruno Oliveira <bruno@soliv.dev>
This commit is contained in:
Sharad Nair 2023-09-18 22:20:04 +05:30 committed by GitHub
parent 8bac8d7807
commit 9a58e6283d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 71 additions and 7 deletions

View File

@ -345,6 +345,7 @@ Segev Finer
Serhii Mozghovyi Serhii Mozghovyi
Seth Junot Seth Junot
Shantanu Jain Shantanu Jain
Sharad Nair
Shubham Adep Shubham Adep
Simon Gomizelj Simon Gomizelj
Simon Holesch Simon Holesch

View File

@ -0,0 +1,2 @@
Logging to a file using the ``--log-file`` option will use ``--log-level``, ``--log-format`` and ``--log-date-format`` as fallback
if ``--log-file-level``, ``--log-file-format`` and ``--log-file-date-format`` are not provided respectively.

View File

@ -303,13 +303,13 @@ def pytest_addoption(parser: Parser) -> None:
add_option_ini( add_option_ini(
"--log-file-format", "--log-file-format",
dest="log_file_format", dest="log_file_format",
default=DEFAULT_LOG_FORMAT, default=None,
help="Log format used by the logging module", help="Log format used by the logging module",
) )
add_option_ini( add_option_ini(
"--log-file-date-format", "--log-file-date-format",
dest="log_file_date_format", dest="log_file_date_format",
default=DEFAULT_LOG_DATE_FORMAT, default=None,
help="Log date format used by the logging module", help="Log date format used by the logging module",
) )
add_option_ini( add_option_ini(
@ -635,7 +635,9 @@ class LoggingPlugin:
self.report_handler.setFormatter(self.formatter) self.report_handler.setFormatter(self.formatter)
# File logging. # File logging.
self.log_file_level = get_log_level_for_setting(config, "log_file_level") self.log_file_level = get_log_level_for_setting(
config, "log_file_level", "log_level"
)
log_file = get_option_ini(config, "log_file") or os.devnull log_file = get_option_ini(config, "log_file") or os.devnull
if log_file != os.devnull: if log_file != os.devnull:
directory = os.path.dirname(os.path.abspath(log_file)) directory = os.path.dirname(os.path.abspath(log_file))

View File

@ -77,14 +77,14 @@ def test_root_logger_affected(pytester: Pytester) -> None:
assert "warning text going to logger" not in stdout assert "warning text going to logger" not in stdout
assert "info text going to logger" not in stdout assert "info text going to logger" not in stdout
# The log file should contain the warning and the error log messages and # The log file should only contain the error log messages and
# not the info one, because the default level of the root logger is # not the warning or info ones, because the root logger is set to
# WARNING. # ERROR using --log-level=ERROR.
assert os.path.isfile(log_file) assert os.path.isfile(log_file)
with open(log_file, encoding="utf-8") as rfh: with open(log_file, encoding="utf-8") as rfh:
contents = rfh.read() contents = rfh.read()
assert "info text going to logger" not in contents assert "info text going to logger" not in contents
assert "warning text going to logger" in contents assert "warning text going to logger" not in contents
assert "error text going to logger" in contents assert "error text going to logger" in contents
@ -1331,3 +1331,62 @@ def test_date_format_percentf_tz_log(pytester: Pytester) -> None:
result.stdout.re_match_lines( result.stdout.re_match_lines(
[r"^[0-9-]{10} [0-9:]{8}.[0-9]{6}[+-][0-9\.]+; WARNING; text"] [r"^[0-9-]{10} [0-9:]{8}.[0-9]{6}[+-][0-9\.]+; WARNING; text"]
) )
def test_log_file_cli_fallback_options(pytester: Pytester) -> None:
"""Make sure that fallback values for log-file formats and level works."""
pytester.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 = str(pytester.path.joinpath("pytest.log"))
result = pytester.runpytest(
"--log-level=ERROR",
"--log-format=%(asctime)s %(message)s",
"--log-date-format=%H:%M",
"--log-file=pytest.log",
)
assert result.ret == 1
# The log file should only contain the error log messages
# not the warning or info ones and the format and date format
# should match the formats provided using --log-format and --log-date-format
assert os.path.isfile(log_file)
with open(log_file, encoding="utf-8") as rfh:
contents = rfh.read()
assert re.match(r"[0-9]{2}:[0-9]{2} error text going to logger\s*", contents)
assert "info text going to logger" not in contents
assert "warning text going to logger" not in contents
assert "error text going to logger" in contents
# Try with a different format and date format to make sure that the formats
# are being used
result = pytester.runpytest(
"--log-level=ERROR",
"--log-format=%(asctime)s : %(message)s",
"--log-date-format=%H:%M:%S",
"--log-file=pytest.log",
)
assert result.ret == 1
# The log file should only contain the error log messages
# not the warning or info ones and the format and date format
# should match the formats provided using --log-format and --log-date-format
assert os.path.isfile(log_file)
with open(log_file, encoding="utf-8") as rfh:
contents = rfh.read()
assert re.match(
r"[0-9]{2}:[0-9]{2}:[0-9]{2} : error text going to logger\s*", contents
)
assert "info text going to logger" not in contents
assert "warning text going to logger" not in contents
assert "error text going to logger" in contents