diff --git a/structlog_gcp/constants.py b/structlog_gcp/constants.py index 13df942..44d8bf6 100644 --- a/structlog_gcp/constants.py +++ b/structlog_gcp/constants.py @@ -16,6 +16,7 @@ "warn": "WARNING", # Warning events might cause problems. "warning": "WARNING", # Warning events might cause problems. "error": "ERROR", # Error events are likely to cause problems. + "exception": "ERROR", # structlog.stdlib.BoundLogger.exception() method name. "critical": "CRITICAL", # Critical events cause more severe problems or outages. # "alert": "ALERT", # A person must take an action immediately. # "emergency": "EMERGENCY", # One or more systems are unusable. diff --git a/tests/conftest.py b/tests/conftest.py index 8527848..3f2583d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -31,14 +31,22 @@ def mock_logger_env() -> Generator[None, None, None]: @pytest.fixture -def logger(mock_logger_env: None) -> Generator[WrappedLogger, None, None]: - """Setup a logger for testing and return it""" +def logger( + request: pytest.FixtureRequest, mock_logger_env: None +) -> Generator[WrappedLogger, None, None]: + """Setup a logger for testing and return it. + + Indirectly parametrize with a ``wrapper_class`` (e.g. + ``structlog.stdlib.BoundLogger``) to bind a non-default logger. + """ structlog.reset_defaults() structlog.contextvars.clear_contextvars() processors = structlog_gcp.build_processors() - structlog.configure(processors=processors) + structlog.configure( + processors=processors, wrapper_class=getattr(request, "param", None) + ) logger = structlog.get_logger() yield logger diff --git a/tests/test_log.py b/tests/test_log.py index 8ff8229..d7be34c 100644 --- a/tests/test_log.py +++ b/tests/test_log.py @@ -1,6 +1,7 @@ import datetime from unittest.mock import patch +import pytest import structlog from _pytest.capture import CaptureFixture from structlog.typing import WrappedLogger @@ -28,7 +29,15 @@ def test_normal(stdout: T_stdout, logger: WrappedLogger) -> None: assert msg == expected +@pytest.mark.parametrize( + "logger", + [None, structlog.stdlib.BoundLogger], + indirect=True, + ids=["default", "stdlib"], +) def test_exception(stdout: T_stdout, logger: WrappedLogger) -> None: + # The stdlib logger's exception() logs with the "exception" method name + # (the default one uses "error"); both must map to ERROR severity. try: 1 / 0 except ZeroDivisionError: