@@ -397,3 +397,52 @@ def test_auto_flush_logs_after_5s(sentry_init, capture_envelopes):
397397 return
398398
399399 raise AssertionError ("1 logs was never flushed after 10 seconds" )
400+
401+
402+ @minimum_python_37
403+ @pytest .mark .parametrize (
404+ "message,expected_body,params" ,
405+ [
406+ ("any text with {braces} in it" , "any text with {braces} in it" , None ),
407+ (
408+ 'JSON data: {"key": "value", "number": 42}' ,
409+ 'JSON data: {"key": "value", "number": 42}' ,
410+ None ,
411+ ),
412+ ("Multiple {braces} {in} {message}" , "Multiple {braces} {in} {message}" , None ),
413+ ("Nested {{braces}}" , "Nested {{braces}}" , None ),
414+ ("Empty braces: {}" , "Empty braces: {}" , None ),
415+ ("Braces with params: {user}" , "Braces with params: alice" , {"user" : "alice" }),
416+ (
417+ "Braces with partial params: {user1} {user2}" ,
418+ "Braces with partial params: alice {user2}" ,
419+ {"user1" : "alice" },
420+ ),
421+ ],
422+ )
423+ def test_logs_with_literal_braces (
424+ sentry_init , capture_envelopes , message , expected_body , params
425+ ):
426+ """
427+ Test that log messages with literal braces (like JSON) work without crashing.
428+ This is a regression test for issue #4975.
429+ """
430+ sentry_init (enable_logs = True )
431+ envelopes = capture_envelopes ()
432+
433+ if params :
434+ sentry_sdk .logger .info (message , ** params )
435+ else :
436+ sentry_sdk .logger .info (message )
437+
438+ get_client ().flush ()
439+ logs = envelopes_to_logs (envelopes )
440+
441+ assert len (logs ) == 1
442+ assert logs [0 ]["body" ] == expected_body
443+
444+ # Verify template is only stored when there are parameters
445+ if params :
446+ assert logs [0 ]["attributes" ]["sentry.message.template" ] == message
447+ else :
448+ assert "sentry.message.template" not in logs [0 ]["attributes" ]
0 commit comments