From 0b7da2847cfe398a450a7f34c5f4586904e9df4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20S=C3=A4ppi?= Date: Mon, 8 Jan 2024 08:55:07 +0200 Subject: [PATCH] Display "exception" logs as level "error" (#586) * Display "exception" logs as level "error" * Update CHANGELOG.md * Update src/structlog/_log_levels.py --------- Co-authored-by: Hynek Schlawack --- CHANGELOG.md | 4 ++++ src/structlog/_log_levels.py | 5 +++++ tests/test_stdlib.py | 9 ++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd033e2..85fb3e2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ You can find our backwards-compatibility policy [here](https://github.com/hynek/ - The lazy logger proxy returned by `structlog.get_logger()` now returns its initial values when asked for context. When asked for context before binding for the first time, it returned an empty dictionary in 23.3.0. +- The displayed level name when using `structlog.stdlib.BoundLogger.exception()` is `"error"` instead of `"exception"`. + Fixes regression in 23.3.0. + [#584](https://github.com/hynek/structlog/issues/584) + - Don't ignore the `width` argument of `RichTracebackFormatter`. [#587](https://github.com/hynek/structlog/issues/587) diff --git a/src/structlog/_log_levels.py b/src/structlog/_log_levels.py index bb7e67b8..df1e81ab 100644 --- a/src/structlog/_log_levels.py +++ b/src/structlog/_log_levels.py @@ -60,10 +60,15 @@ def add_log_level( .. versionchanged:: 20.2.0 Importable from `structlog.processors` (additionally to `structlog.stdlib`). + .. versionchanged:: 24.1.0 + Added mapping from "exception" to "error" """ if method_name == "warn": # The stdlib has an alias method_name = "warning" + elif method_name == "exception": + # exception("") method is the same as error("", exc_info=True) + method_name = "error" event_dict["level"] = method_name diff --git a/tests/test_stdlib.py b/tests/test_stdlib.py index f1ae444e..1c690f1f 100644 --- a/tests/test_stdlib.py +++ b/tests/test_stdlib.py @@ -488,13 +488,16 @@ def test_log_level_added(self): assert "error" == event_dict["level"] - def test_log_level_alias_normalized(self): + @pytest.mark.parametrize( + ("alias", "normalized"), [("warn", "warning"), ("exception", "error")] + ) + def test_log_level_alias_normalized(self, alias, normalized): """ The normalized name of the log level is added to the event dict. """ - event_dict = add_log_level(None, "warn", {}) + event_dict = add_log_level(None, alias, {}) - assert "warning" == event_dict["level"] + assert normalized == event_dict["level"] @pytest.fixture(name="make_log_record")