11import sys
22import logging
3+ from contextlib import contextmanager
4+ from functools import wraps
35
46from .service import PyTestService
57
@@ -48,8 +50,19 @@ class RPLogHandler(logging.Handler):
4850 }
4951 _sorted_levelnos = sorted (_loglevel_map .keys (), reverse = True )
5052
51- def __init__ (self , level = logging .NOTSET ):
53+ def __init__ (self , level = logging .NOTSET ,
54+ filter_reportportal_client_logs = False ):
5255 super (RPLogHandler , self ).__init__ (level )
56+ self .filter_reportportal_client_logs = filter_reportportal_client_logs
57+
58+ def filter (self , record ):
59+ if self .filter_reportportal_client_logs is False :
60+ return True
61+ if record .name .startswith ('reportportal_client' ):
62+ # Don't send reportportal_client logs.
63+ # Specially because we'll hit a max recursion issue
64+ return False
65+ return True
5366
5467 def emit (self , record ):
5568 msg = ''
@@ -70,3 +83,52 @@ def emit(self, record):
7083 loglevel = self ._loglevel_map [level ],
7184 attachment = record .__dict__ .get ('attachment' , None ),
7285 )
86+
87+
88+ @contextmanager
89+ def patching_logger_class ():
90+ logger_class = logging .getLoggerClass ()
91+ original_log = logger_class ._log
92+ original_makeRecord = logger_class .makeRecord
93+
94+ try :
95+ def wrap_log (original_func ):
96+ @wraps (original_func )
97+ def _log (self , * args , ** kwargs ):
98+ attachment = kwargs .pop ('attachment' , None )
99+ if attachment is not None :
100+ kwargs .setdefault ('extra' , {}).update (
101+ {'attachment' : attachment })
102+ return original_func (self , * args , ** kwargs )
103+ return _log
104+
105+ def wrap_makeRecord (original_func ):
106+ @wraps (original_func )
107+ def makeRecord (self , name , level , fn , lno , msg , args , exc_info ,
108+ func = None , extra = None , sinfo = None ):
109+ if extra is not None :
110+ attachment = extra .pop ('attachment' , None )
111+ else :
112+ attachment = None
113+ try :
114+ # Python 3.5
115+ record = original_func (self , name , level , fn , lno , msg ,
116+ args , exc_info , func = func ,
117+ extra = extra , sinfo = sinfo )
118+ except TypeError :
119+ # Python 2.7
120+ record = original_func (self , name , level , fn , lno , msg ,
121+ args , exc_info , func = func ,
122+ extra = extra )
123+ record .attachment = attachment
124+ return record
125+ return makeRecord
126+
127+ logger_class ._log = wrap_log (logger_class ._log )
128+ logger_class .makeRecord = wrap_makeRecord (logger_class .makeRecord )
129+
130+ yield
131+
132+ finally :
133+ logger_class ._log = original_log
134+ logger_class .makeRecord = original_makeRecord
0 commit comments