diff --git a/structlog_gcp/error_reporting.py b/structlog_gcp/error_reporting.py index 23e2968..123f9ba 100644 --- a/structlog_gcp/error_reporting.py +++ b/structlog_gcp/error_reporting.py @@ -29,9 +29,7 @@ def __call__( event_dict[CLOUD_LOGGING_KEY]["@type"] = ERROR_EVENT_TYPE # https://cloud.google.com/error-reporting/docs/formatting-error-messages - message = event_dict[CLOUD_LOGGING_KEY]["message"] - error_message = f"{message}\n{exception}" - event_dict[CLOUD_LOGGING_KEY]["stack_trace"] = error_message + event_dict[CLOUD_LOGGING_KEY]["stack_trace"] = exception return event_dict diff --git a/tests/fakes.py b/tests/fakes.py index 7a0df1c..ae5eef9 100644 --- a/tests/fakes.py +++ b/tests/fakes.py @@ -2,7 +2,8 @@ from typing import Collection -from structlog.processors import CallsiteParameter +from structlog._frames import _format_exception +from structlog.processors import CallsiteParameter, _figure_out_exc_info from structlog.typing import EventDict, WrappedLogger @@ -34,7 +35,16 @@ def __call__( def format_exc_info( logger: WrappedLogger, method_name: str, event_dict: EventDict ) -> EventDict: - exc_info = event_dict.pop("exc_info", None) + exc_info = _figure_out_exc_info(event_dict.pop("exc_info", None)) + if exc_info: - event_dict["exception"] = "Traceback blabla" + exception = _format_exception(exc_info) + # Format the exception, but only keep the "Traceback ..." and the + # actual exception line, and skip all the rest. + # We need to skip the middle lines as they contain the path to the + # files, which differs depending on which path the library is tested + # from. + head = exception.splitlines()[0] + tail = exception.splitlines()[-1] + event_dict["exception"] = f"{head}\n...\n{tail}" return event_dict diff --git a/tests/test_log.py b/tests/test_log.py index d85d2b8..8ff8229 100644 --- a/tests/test_log.py +++ b/tests/test_log.py @@ -57,7 +57,7 @@ def test_exception(stdout: T_stdout, logger: WrappedLogger) -> None: "foo": "bar", "severity": "ERROR", "message": "oh noes", - "stack_trace": "oh noes\nTraceback blabla", + "stack_trace": "Traceback (most recent call last):\n...\nZeroDivisionError: division by zero", "time": "2023-04-01T08:00:00.000000Z", } assert msg == expected @@ -191,7 +191,7 @@ def test_core_processors_only( assert "" == output.err msg = output.out.strip() - # No JSON formmating, no contextvars + # No JSON formatting, no contextvars expected = "message='test' time='2023-04-01T08:00:00.000000Z' severity='INFO' logging.googleapis.com/sourceLocation={'file': '/app/test.py', 'line': '42', 'function': 'test:test123'}" assert expected == msg @@ -225,7 +225,7 @@ def test_exception_different_level(stdout: T_stdout, logger: WrappedLogger) -> N }, "severity": "WARNING", "message": "oh no; anyways", - "stack_trace": "oh no; anyways\ndivision by zero", + "stack_trace": "ZeroDivisionError('division by zero')", "time": "2023-04-01T08:00:00.000000Z", } assert msg == expected