@@ -153,6 +153,7 @@ def test_log_record_exception(self):
153153 log_record = processor .get_log_record (0 )
154154
155155 self .assertIsNotNone (log_record )
156+ self .assertTrue (isinstance (log_record .body , str ))
156157 self .assertEqual (log_record .body , "Zero Division Error" )
157158 self .assertEqual (
158159 log_record .attributes [SpanAttributes .EXCEPTION_TYPE ],
@@ -226,6 +227,40 @@ def test_log_exc_info_false(self):
226227 SpanAttributes .EXCEPTION_STACKTRACE , log_record .attributes
227228 )
228229
230+ def test_log_record_exception_with_object_payload (self ):
231+ processor , logger = set_up_test_logging (logging .ERROR )
232+
233+ class CustomException (Exception ):
234+ def __str__ (self ):
235+ return "CustomException stringified"
236+
237+ try :
238+ raise CustomException ("CustomException message" )
239+ except CustomException as exception :
240+ with self .assertLogs (level = logging .ERROR ):
241+ logger .exception (exception )
242+
243+ log_record = processor .get_log_record (0 )
244+
245+ self .assertIsNotNone (log_record )
246+ self .assertTrue (isinstance (log_record .body , str ))
247+ self .assertEqual (log_record .body , "CustomException stringified" )
248+ self .assertEqual (
249+ log_record .attributes [SpanAttributes .EXCEPTION_TYPE ],
250+ CustomException .__name__ ,
251+ )
252+ self .assertEqual (
253+ log_record .attributes [SpanAttributes .EXCEPTION_MESSAGE ],
254+ "CustomException message" ,
255+ )
256+ stack_trace = log_record .attributes [
257+ SpanAttributes .EXCEPTION_STACKTRACE
258+ ]
259+ self .assertIsInstance (stack_trace , str )
260+ self .assertTrue ("Traceback" in stack_trace )
261+ self .assertTrue ("CustomException" in stack_trace )
262+ self .assertTrue (__file__ in stack_trace )
263+
229264 def test_log_record_trace_correlation (self ):
230265 processor , logger = set_up_test_logging (logging .WARNING )
231266
0 commit comments