2020
2121from .compatibility import StringIO , string_type , to_str , xbmc
2222from .constants import ADDON_ID
23- from .utils .convert_format import to_unicode
23+ from .utils .convert_format import to_unicode , urls_in_text
2424from .utils .redact import (
2525 parse_and_redact_uri ,
2626 redact_auth_header ,
@@ -74,24 +74,32 @@ def formatStack(self, stack_info):
7474
7575 def format (self , record ):
7676 record .message = to_unicode (record .getMessage ())
77+
7778 if self .usesTime ():
7879 record .asctime = self .formatTime (record , self .datefmt )
80+
7981 s = self .formatMessage (record )
82+
83+ if record .stack_info :
84+ if not record .stack_text :
85+ stack_text = self .formatStack (record .stack_info )
86+ if getattr (record , '__redact_stack__' , False ):
87+ stack_text = urls_in_text (stack_text , parse_and_redact_uri )
88+ record .stack_text = stack_text
89+ if s [- 1 :] != '\n ' :
90+ s += '\n \n '
91+ s += record .stack_text
92+
8093 if record .exc_info :
8194 if not record .exc_text :
82- record .exc_text = self .formatException (record .exc_info )
83- if record .exc_text :
84- if record .stack_info :
85- if s [- 1 :] != '\n ' :
86- s += '\n \n '
87- s += self .formatStack (record .stack_info )
95+ exc_text = self .formatException (record .exc_info )
96+ if getattr (record , '__redact_exc__' , False ):
97+ exc_text = urls_in_text (exc_text , parse_and_redact_uri )
98+ record .exc_text = exc_text
8899 if s [- 1 :] != '\n ' :
89100 s += '\n \n '
90101 s += record .exc_text
91- elif record .stack_info :
92- if s [- 1 :] != '\n ' :
93- s += '\n \n '
94- s += self .formatStack (record .stack_info )
102+
95103 return s
96104
97105
@@ -308,8 +316,7 @@ def stack_info(self, value):
308316
309317class LogRecord (logging .LogRecord ):
310318 def __init__ (self , name , level , pathname , lineno , msg , args , exc_info ,
311- func = None , ** kwargs ):
312- stack_info = kwargs .pop ('sinfo' , None )
319+ func = None , sinfo = None , extra = None , ** kwargs ):
313320 super (LogRecord , self ).__init__ (name ,
314321 level ,
315322 pathname ,
@@ -319,7 +326,21 @@ def __init__(self, name, level, pathname, lineno, msg, args, exc_info,
319326 exc_info ,
320327 func = func ,
321328 ** kwargs )
322- self .stack_info = stack_info
329+ self .message = None
330+ self .asctime = None
331+ self .stack_info = sinfo
332+ self .stack_text = None
333+ if extra is not None :
334+ attrs = self .__dict__
335+ duplicate_attrs = set (extra ).intersection (attrs .keys ())
336+ if duplicate_attrs :
337+ raise KeyError (
338+ "Attempt to overwrite LogRecord attributes: ('%s',)" % (
339+ "', '" .join (duplicate_attrs )
340+ )
341+ )
342+ else :
343+ attrs .update (extra )
323344
324345 if not current_system_version .compatible (19 ):
325346 def getMessage (self ):
@@ -423,21 +444,18 @@ def findCaller(self, stack_info=False, stacklevel=1):
423444
424445 def makeRecord (self , name , level , fn , lno , msg , args , exc_info ,
425446 func = None , extra = None , sinfo = None ):
426- rv = LogRecord (name ,
427- level ,
428- fn ,
429- lno ,
430- msg ,
431- args ,
432- exc_info ,
433- func = func ,
434- sinfo = sinfo )
435- if extra is not None :
436- for key in extra :
437- if (key in ["message" , "asctime" ]) or (key in rv .__dict__ ):
438- raise KeyError ("Attempt to overwrite %r in LogRecord" % key )
439- rv .__dict__ [key ] = extra [key ]
440- return rv
447+ return LogRecord (
448+ name ,
449+ level ,
450+ fn ,
451+ lno ,
452+ msg ,
453+ args ,
454+ exc_info ,
455+ func = func ,
456+ sinfo = sinfo ,
457+ extra = extra ,
458+ )
441459
442460 def exception (self , msg , * args , ** kwargs ):
443461 if self .isEnabledFor (ERROR ):
0 commit comments