diff --git a/sentry_sdk/integrations/logging.py b/sentry_sdk/integrations/logging.py index bf538ac7c7..46628bb04b 100644 --- a/sentry_sdk/integrations/logging.py +++ b/sentry_sdk/integrations/logging.py @@ -355,6 +355,7 @@ def _capture_log_from_record(client, record): # type: (BaseClient, LogRecord) -> None scope = sentry_sdk.get_current_scope() otel_severity_number, otel_severity_text = _python_level_to_otel(record.levelno) + project_root = client.options["project_root"] attrs = { "sentry.origin": "auto.logger.log", } # type: dict[str, str | bool | float | int] @@ -374,7 +375,10 @@ def _capture_log_from_record(client, record): if record.lineno: attrs["code.line.number"] = record.lineno if record.pathname: - attrs["code.file.path"] = record.pathname + if project_root is not None and record.pathname.startswith(project_root): + attrs["code.file.path"] = record.pathname[len(project_root) + 1 :] + else: + attrs["code.file.path"] = record.pathname if record.funcName: attrs["code.function.name"] = record.funcName diff --git a/tests/test_logs.py b/tests/test_logs.py index c6ef8bcc9d..49ffd31ec7 100644 --- a/tests/test_logs.py +++ b/tests/test_logs.py @@ -346,7 +346,6 @@ def test_logging_errors(sentry_init, capture_envelopes): error_event_2 = envelopes[1].items[0].payload.json assert error_event_2["level"] == "error" - print(envelopes) logs = envelopes_to_logs(envelopes) assert logs[0]["severity_text"] == "error" assert "sentry.message.template" not in logs[0]["attributes"] @@ -364,6 +363,36 @@ def test_logging_errors(sentry_init, capture_envelopes): assert len(logs) == 2 +def test_log_strips_project_root(sentry_init, capture_envelopes): + """ + The python logger should strip project roots from the log record path + """ + sentry_init( + _experiments={"enable_logs": True}, + project_root="/custom/test", + ) + envelopes = capture_envelopes() + + python_logger = logging.Logger("test-logger") + python_logger.handle( + logging.LogRecord( + name="test-logger", + level=logging.WARN, + pathname="/custom/test/blah/path.py", + lineno=123, + msg="This is a test log with a custom pathname", + args=(), + exc_info=None, + ) + ) + get_client().flush() + + logs = envelopes_to_logs(envelopes) + assert len(logs) == 1 + attrs = logs[0]["attributes"] + assert attrs["code.file.path"] == "blah/path.py" + + def test_auto_flush_logs_after_100(sentry_init, capture_envelopes): """ If you log >100 logs, it should automatically trigger a flush.