Skip to content

Commit f4fafea

Browse files
feat(logging): Add formatted message to log events
Send the formatted log event to Sentry in the [`formatted` field](https://develop.sentry.dev/sdk/data-model/event-payloads/message/). This builds on #4291, providing a more robust fix for #3660.
1 parent e71ccbf commit f4fafea

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

sentry_sdk/integrations/logging.py

+1
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ def _emit(self, record):
264264

265265
else:
266266
event["logentry"] = {
267+
"formatted": record.getMessage(),
267268
"message": to_string(record.msg),
268269
"params": record.args,
269270
}

tests/integrations/logging/test_logging.py

+15
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def test_logging_works_with_many_loggers(sentry_init, capture_events, logger):
2626
assert event["level"] == "fatal"
2727
assert not event["logentry"]["params"]
2828
assert event["logentry"]["message"] == "LOL"
29+
assert event["logentry"]["formatted"] == "LOL"
2930
assert any(crumb["message"] == "bread" for crumb in event["breadcrumbs"]["values"])
3031

3132

@@ -112,6 +113,7 @@ def test_logging_level(sentry_init, capture_events):
112113
(event,) = events
113114
assert event["level"] == "error"
114115
assert event["logentry"]["message"] == "hi"
116+
assert event["logentry"]["formatted"] == "hi"
115117

116118
del events[:]
117119

@@ -152,6 +154,7 @@ def test_custom_log_level_names(sentry_init, capture_events):
152154
assert events
153155
assert events[0]["level"] == sentry_level
154156
assert events[0]["logentry"]["message"] == "Trying level %s"
157+
assert events[0]["logentry"]["formatted"] == f"Trying level {logging_level}"
155158
assert events[0]["logentry"]["params"] == [logging_level]
156159

157160
del events[:]
@@ -177,6 +180,7 @@ def filter(self, record):
177180

178181
(event,) = events
179182
assert event["logentry"]["message"] == "hi"
183+
assert event["logentry"]["formatted"] == "hi"
180184

181185

182186
def test_logging_captured_warnings(sentry_init, capture_events, recwarn):
@@ -198,10 +202,12 @@ def test_logging_captured_warnings(sentry_init, capture_events, recwarn):
198202
assert events[0]["level"] == "warning"
199203
# Captured warnings start with the path where the warning was raised
200204
assert "UserWarning: first" in events[0]["logentry"]["message"]
205+
assert "UserWarning: first" in events[0]["logentry"]["formatted"]
201206
assert events[0]["logentry"]["params"] == []
202207

203208
assert events[1]["level"] == "warning"
204209
assert "UserWarning: second" in events[1]["logentry"]["message"]
210+
assert "UserWarning: second" in events[1]["logentry"]["formatted"]
205211
assert events[1]["logentry"]["params"] == []
206212

207213
# Using recwarn suppresses the "third" warning in the test output
@@ -234,6 +240,7 @@ def test_ignore_logger_wildcard(sentry_init, capture_events):
234240

235241
(event,) = events
236242
assert event["logentry"]["message"] == "hi"
243+
assert event["logentry"]["formatted"] == "hi"
237244

238245

239246
def test_logging_dictionary_interpolation(sentry_init, capture_events):
@@ -245,6 +252,10 @@ def test_logging_dictionary_interpolation(sentry_init, capture_events):
245252

246253
(event,) = events
247254
assert event["logentry"]["message"] == "this is a log with a dictionary %s"
255+
assert (
256+
event["logentry"]["formatted"]
257+
== "this is a log with a dictionary {'foo': 'bar'}"
258+
)
248259
assert event["logentry"]["params"] == {"foo": "bar"}
249260

250261

@@ -263,4 +274,8 @@ def test_logging_dictionary_args(sentry_init, capture_events):
263274
event["logentry"]["message"]
264275
== "the value of foo is %(foo)s, and the value of bar is %(bar)s"
265276
)
277+
assert (
278+
event["logentry"]["formatted"]
279+
== "the value of foo is bar, and the value of bar is baz"
280+
)
266281
assert event["logentry"]["params"] == {"foo": "bar", "bar": "baz"}

0 commit comments

Comments
 (0)