Skip to content

Commit bf4d921

Browse files
authored
fix(logs): Do not attach template if there are no parameters (#4728)
Closes #4725
1 parent 57a3405 commit bf4d921

File tree

5 files changed

+78
-5
lines changed

5 files changed

+78
-5
lines changed

sentry_sdk/integrations/logging.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,32 +356,43 @@ def _capture_log_from_record(self, client, record):
356356
record.levelno, SEVERITY_TO_OTEL_SEVERITY
357357
)
358358
project_root = client.options["project_root"]
359+
359360
attrs = self._extra_from_record(record) # type: Any
360361
attrs["sentry.origin"] = "auto.logger.log"
361-
if isinstance(record.msg, str):
362-
attrs["sentry.message.template"] = record.msg
362+
363+
parameters_set = False
363364
if record.args is not None:
364365
if isinstance(record.args, tuple):
366+
parameters_set = bool(record.args)
365367
for i, arg in enumerate(record.args):
366368
attrs[f"sentry.message.parameter.{i}"] = (
367369
arg
368370
if isinstance(arg, (str, float, int, bool))
369371
else safe_repr(arg)
370372
)
371373
elif isinstance(record.args, dict):
374+
parameters_set = bool(record.args)
372375
for key, value in record.args.items():
373376
attrs[f"sentry.message.parameter.{key}"] = (
374377
value
375378
if isinstance(value, (str, float, int, bool))
376379
else safe_repr(value)
377380
)
381+
382+
if parameters_set and isinstance(record.msg, str):
383+
# only include template if there is at least one
384+
# sentry.message.parameter.X set
385+
attrs["sentry.message.template"] = record.msg
386+
378387
if record.lineno:
379388
attrs["code.line.number"] = record.lineno
389+
380390
if record.pathname:
381391
if project_root is not None and record.pathname.startswith(project_root):
382392
attrs["code.file.path"] = record.pathname[len(project_root) + 1 :]
383393
else:
384394
attrs["code.file.path"] = record.pathname
395+
385396
if record.funcName:
386397
attrs["code.function.name"] = record.funcName
387398

sentry_sdk/logger.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ def _capture_log(severity_text, severity_number, template, **kwargs):
2222
# type: (str, int, str, **Any) -> None
2323
client = get_client()
2424

25-
attrs = {
26-
"sentry.message.template": template,
27-
} # type: dict[str, str | bool | float | int]
25+
attrs = {} # type: dict[str, str | bool | float | int]
2826
if "attributes" in kwargs:
2927
attrs.update(kwargs.pop("attributes"))
3028
for k, v in kwargs.items():
3129
attrs[f"sentry.message.parameter.{k}"] = v
30+
if kwargs:
31+
# only attach template if there are parameters
32+
attrs["sentry.message.template"] = template
3233

3334
attrs = {
3435
k: (

tests/integrations/logging/test_logging.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,3 +571,22 @@ def test_sentry_logs_named_parameters_complex_values(sentry_init, capture_envelo
571571
assert isinstance(complex_param, str)
572572
assert "nested" in complex_param
573573
assert "data" in complex_param
574+
575+
576+
def test_sentry_logs_no_parameters_no_template(sentry_init, capture_envelopes):
577+
"""
578+
There shouldn't be a template if there are no parameters.
579+
"""
580+
sentry_init(enable_logs=True)
581+
envelopes = capture_envelopes()
582+
583+
python_logger = logging.Logger("test-logger")
584+
python_logger.warning("Warning about something without any parameters.")
585+
586+
get_client().flush()
587+
logs = envelopes_to_logs(envelopes)
588+
589+
assert len(logs) == 1
590+
591+
attrs = logs[0]["attributes"]
592+
assert "sentry.message.template" not in attrs

tests/integrations/loguru/test_loguru.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,3 +467,21 @@ def test_logger_with_all_attributes(
467467
"sentry.severity_number": 13,
468468
"sentry.severity_text": "warn",
469469
}
470+
471+
472+
def test_no_parameters_no_template(
473+
sentry_init, capture_envelopes, uninstall_integration, request
474+
):
475+
uninstall_integration("loguru")
476+
request.addfinalizer(logger.remove)
477+
478+
sentry_init(enable_logs=True)
479+
envelopes = capture_envelopes()
480+
481+
logger.warning("Logging a hardcoded warning")
482+
sentry_sdk.get_client().flush()
483+
484+
logs = envelopes_to_logs(envelopes)
485+
486+
attributes = logs[0]["attributes"]
487+
assert "sentry.message.template" not in attributes

tests/test_logs.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,30 +254,54 @@ def test_logs_message_params(sentry_init, capture_envelopes):
254254
sentry_sdk.logger.error(
255255
"The recorded error was '{error}'", error=Exception("some error")
256256
)
257+
sentry_sdk.logger.warning("The recorded value was hardcoded.")
257258

258259
get_client().flush()
259260
logs = envelopes_to_logs(envelopes)
260261

261262
assert logs[0]["body"] == "The recorded value was '1'"
262263
assert logs[0]["attributes"]["sentry.message.parameter.int_var"] == 1
264+
assert (
265+
logs[0]["attributes"]["sentry.message.template"]
266+
== "The recorded value was '{int_var}'"
267+
)
263268

264269
assert logs[1]["body"] == "The recorded value was '2.0'"
265270
assert logs[1]["attributes"]["sentry.message.parameter.float_var"] == 2.0
271+
assert (
272+
logs[1]["attributes"]["sentry.message.template"]
273+
== "The recorded value was '{float_var}'"
274+
)
266275

267276
assert logs[2]["body"] == "The recorded value was 'False'"
268277
assert logs[2]["attributes"]["sentry.message.parameter.bool_var"] is False
278+
assert (
279+
logs[2]["attributes"]["sentry.message.template"]
280+
== "The recorded value was '{bool_var}'"
281+
)
269282

270283
assert logs[3]["body"] == "The recorded value was 'some string value'"
271284
assert (
272285
logs[3]["attributes"]["sentry.message.parameter.string_var"]
273286
== "some string value"
274287
)
288+
assert (
289+
logs[3]["attributes"]["sentry.message.template"]
290+
== "The recorded value was '{string_var}'"
291+
)
275292

276293
assert logs[4]["body"] == "The recorded error was 'some error'"
277294
assert (
278295
logs[4]["attributes"]["sentry.message.parameter.error"]
279296
== "Exception('some error')"
280297
)
298+
assert (
299+
logs[4]["attributes"]["sentry.message.template"]
300+
== "The recorded error was '{error}'"
301+
)
302+
303+
assert logs[5]["body"] == "The recorded value was hardcoded."
304+
assert "sentry.message.template" not in logs[5]["attributes"]
281305

282306

283307
@minimum_python_37

0 commit comments

Comments
 (0)