8000 feat(logging): Add formatted message to log events · getsentry/sentry-python@296e288 · GitHub
[go: up one dir, main page]

Skip to content

Commit 296e288

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 296e288

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

sentry_sdk/integrations/logging.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,13 @@ def _emit(self, record):
259259

260260
event["logentry"] = {
261261
"message": msg,
262+
"formatted": record.getMessage(),
262263
"params": (),
263264
}
264265

265266
else:
266267
event["logentry"] = {
268+
"formatted": record.getMessage(),
267269
"message": to_string(record.msg),
268270
"params": record.args,
269271
}

tests/integrations/logging/test_logging.py

Lines changed: 19 additions & 0 deletions
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,16 @@ 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"]
206+
# For warnings, the message and formatted message are the same
207+
assert events[0]["logentry"]["message"] == events[0]["logentry"]["formatted"]
201208
assert events[0]["logentry"]["params"] == []
202209

203210
assert events[1]["level"] == "warning"
204211
assert "UserWarning: second" in events[1]["logentry"]["message"]
212+
assert "UserWarning: second" in events[1]["logentry"]["formatted"]
213+
# For warnings, the message and formatted message are the same
214+
assert events[1]["logentry"]["message"] == events[1]["logentry"]["formatted"]
205215
assert events[1]["logentry"]["params"] == []
206216

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

235245
(event,) = events
236246
assert event["logentry"]["message"] == "hi"
247+
assert event["logentry"]["formatted"] == "hi"
237248

238249

239250
def test_logging_dictionary_interpolation(sentry_init, capture_events):
@@ -245,6 +256,10 @@ def test_logging_dictionary_interpolation(sentry_init, capture_events):
245256

246257
(event,) = events
247258
assert event["logentry"]["message"] == "this is a log with a dictionary %s"
259+
assert (
260+
event["logentry"]["formatted"]
261+
== "this is a log with a dictionary {'foo': 'bar'}"
262+
)
248263
assert event["logentry"]["params"] == {"foo": "bar"}
249264

250265

@@ -263,4 +278,8 @@ def test_logging_dictionary_args(sentry_init, capture_events):
263278
event["logentry"]["message"]
264279
== "the value of foo is %(foo)s, and the value of bar is %(bar)s"
265280
)
281+
assert (
282+
event["logentry"]["formatted"]
283+
== "the value of foo is bar, and the value of bar is baz"
284+
)
266285
assert event["logentry"]["params"] == {"foo": "bar", "bar": "baz"}

0 commit comments

Comments
 (0)
0