Skip to content

Commit 4ecd5a1

Browse files
authored
Merge branch 'master' into ivana/undeprecate-same-process-as-parent
2 parents 756db70 + 296e288 commit 4ecd5a1

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

sentry_sdk/integrations/logging.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,15 @@ 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),
268-
"params": (
269-
tuple(str(arg) if arg is None else arg for arg in record.args)
270-
if record.args
271-
else ()
272-
),
270+
"params": record.args,
273271
}
274272

275273
event["extra"] = self._extra_from_record(record)

tests/integrations/logging/test_logging.py

Lines changed: 49 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,3 +244,42 @@ 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"
248+
249+
250+
def test_logging_dictionary_interpolation(sentry_init, capture_events):
251+
"""Here we test an entire dictionary being interpolated into the log message."""
252+
sentry_init(integrations=[LoggingIntegration()], default_integrations=False)
253+
events = capture_events()
254+
255+
logger.error("this is a log with a dictionary %s", {"foo": "bar"})
256+
257+
(event,) = events
258+
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+
)
263+
assert event["logentry"]["params"] == {"foo": "bar"}
264+
265+
266+
def test_logging_dictionary_args(sentry_init, capture_events):
267+
"""Here we test items from a dictionary being interpolated into the log message."""
268+
sentry_init(integrations=[LoggingIntegration()], default_integrations=False)
269+
events = capture_events()
270+
271+
logger.error(
272+
"the value of foo is %(foo)s, and the value of bar is %(bar)s",
273+
{"foo": "bar", "bar": "baz"},
274+
)
275+
276+
(event,) = events
277+
assert (
278+
event["logentry"]["message"]
279+
== "the value of foo is %(foo)s, and the value of bar is %(bar)s"
280+
)
281+
assert (
282+
event["logentry"]["formatted"]
283+
== "the value of foo is bar, and the value of bar is baz"
284+
)
285+
assert event["logentry"]["params"] == {"foo": "bar", "bar": "baz"}

0 commit comments

Comments
 (0)