33import logging
44import uuid
55from datetime import datetime
6+ import traceback
67
78from json_logging import util
89from json_logging .framework_base import RequestAdapter , ResponseAdapter , AppRequestInstrumentationConfigurator , \
@@ -225,6 +226,21 @@ class JSONLogFormatter(logging.Formatter):
225226 Formatter for non-web application log
226227 """
227228
229+ def get_exc_fields (self , record ):
230+ if record .exc_info :
231+ exc_info = self .format_exception (record .exc_info )
232+ else :
233+ exc_info = record .exc_text
234+ return {
235+ 'exc_info' : exc_info ,
236+ 'filename' : record .filename ,
237+ }
238+
239+ @classmethod
240+ def format_exception (cls , exc_info ):
241+
242+ return '' .join (traceback .format_exception (* exc_info )) if exc_info else ''
243+
228244 def format (self , record ):
229245 utcnow = datetime .utcnow ()
230246 json_log_object = {"type" : "log" ,
@@ -237,13 +253,15 @@ def format(self, record):
237253 "thread" : record .threadName ,
238254 "level" : record .levelname ,
239255 "module" : record .module ,
240- "line_no" : record .lineno ,
241- "msg" : record .getMessage ()
256+ "msg" : record .getMessage (),
242257 }
243258
244259 if hasattr (record , 'props' ):
245260 json_log_object .update (record .props )
246261
262+ if record .exc_info or record .exc_text :
263+ json_log_object .update (self .get_exc_fields (record ))
264+
247265 return JSON_SERIALIZER (json_log_object )
248266
249267
@@ -252,6 +270,21 @@ class JSONLogWebFormatter(logging.Formatter):
252270 Formatter for web application log
253271 """
254272
273+ def get_exc_fields (self , record ):
274+ if record .exc_info :
275+ exc_info = self .format_exception (record .exc_info )
276+ else :
277+ exc_info = record .exc_text
278+ return {
279+ 'exc_info' : exc_info ,
280+ 'filename' : record .filename ,
281+ }
282+
283+ @classmethod
284+ def format_exception (cls , exc_info ):
285+
286+ return '' .join (traceback .format_exception (* exc_info )) if exc_info else ''
287+
255288 def format (self , record ):
256289 utcnow = datetime .utcnow ()
257290 json_log_object = {"type" : "log" ,
@@ -272,6 +305,9 @@ def format(self, record):
272305 if hasattr (record , 'props' ):
273306 json_log_object .update (record .props )
274307
308+ if hasattr (record , 'exc_info' ) or hasattr (record , 'exc_text' ):
309+ json_log_object .update (self .get_exc_fields (record ))
310+
275311 return JSON_SERIALIZER (json_log_object )
276312
277313
0 commit comments